test_your_nc
直接输入命令即可,直接将输入放入system函数执行
rip
ret2text题目,有个坑,buf不是从8的整数地址开始放置的,查看栈帧情况如下

小端存储,栈顶位置放了一个0x90,然后才是buf,所以写payload时填充的长度要减一
warmup_csaw_2016
ret2text题目,这里直接给了system('cat flag.txt');
ciscn_2019_n_1
通过查看IDA Pro源码,只要将v1溢出到使v2为11.28125即可
1 | if ( v2 == 11.28125 ) |
先将11.28125转成16进制,注意小端存储,应该是0x41348000,加到payload上即可
1 | import struct |
pwn1_sctf_2016
这道题的难点是发现replace函数会将I替换成you(阅读源码很难看出,可以根据程序运行效果结合ChatGPT推测),从而解决了最大输入长度只有30,但距离栈底有0x3c,无法溢出的问题,将返回地址设成system('cat flag.txt');的地址即可
level0
ret2text,没什么特别的
[第五空间2019 决赛]PWN5
格式化字符串漏洞
jarvisoj_level2
开启NX保护,没有可执行段,ret2libc题目,类似ctf wiki的ret2libc1,已经给出system的plt表项和/bin/sh字符串,可以使用elf.symbols['system']直接获得plt表项
ciscn_2019_n_8
程序的保护措施都开了,但这道题是一个逻辑绕过,跟溢出无关,核心是下面一段代码,只要使var[13]等于17即可
1 | if ( *(_QWORD *)&var[13] == 17LL ) |
重点在于var是个什么类型的数组,(_QWORD *)这个指针类型是多少位,在IDA Pro中点进var可以看到
1 | .bss:00004060 ; _DWORD var[15] |
WORD表示两字节(字)
_QWORD是一个无符号 64 位整数的数据类型,通常用于表示 64 位的整数值
_DWORD是一个无符号 32 位整数的数据类型,通常用于表示 32 位的整数值
所以数组是32位的,但在判断时是取64位(8个字节判断)
本着互联网开源的性质,欢迎分享这篇文章,以帮助到更多的人,谢谢!