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个字节判断)
本着互联网开源的性质,欢迎分享这篇文章,以帮助到更多的人,谢谢!