我正在尝试覆盖GOT条目,以便调用ParallaxImageView ivBackground = findViewById(R.id.iv_background);
ivBackground.setMargins(300, 200);
ivBackground.setMultipliers(1.5f, 1.7f);
会调用printf
(下面的system
)。
callme
我的想法是在第一个// gcc source.c -no-pie -fno-pic -fno-stack-protector -g
#include <stdio.h>
#include <stdlib.h>
void callme(char *p) {
system(p);
}
int main(int argc, char **argv)
{
char *pointer = NULL;
char array[10];
pointer = array;
fgets(pointer, 18, stdin);
printf("p contains %s at %p\n", pointer, &pointer);
fgets(pointer, 8, stdin);
printf("p contains %s at %p\n", pointer, &pointer);
return EXIT_SUCCESS;
}
中写入10个随机字符,并在第二个fgets
中写入printf @ plt的地址。
callme
要尝试一下,我将使用一些A覆盖get
。gef➤ p &pointer
$1 = (char **) 0x7fffffffdea8
gef➤ p &array
$2 = (char (*)[10]) 0x7fffffffde9e
gef➤ p (0x7fffffffde9e+10)
$3 = 0x7fffffffdea8
其中0x061020是获取位置的地址。
在第二个gef➤ r < <(printf "%010d\x20\x10\x60\x00\x00\x00\x00\x00" 0) <(perl -e "print 'A'x8")
之前
fgets
这很好,那么gef➤ x/g pointer
0x601020: 0x7ffff7a48e80
gef➤ x/i 0x7ffff7a48e80
0x7ffff7a48e80 <__printf>: sub rsp,0xd8
不会改变值,我也不会写到get。我希望在SIGSEGV的下一次调用*pointer
时得到“ A” * 8,但它可以正常运行。