PWN

BUUCTF PWN Write up

Posted by Leo on 2023-11-29
Estimated Reading Time 2 Minutes
Words 558 In Total

test_your_nc

直接输入命令即可,直接将输入放入system函数执行

rip

ret2text题目,有个坑,buf不是从8的整数地址开始放置的,查看栈帧情况如下

image-20231129174820414

小端存储,栈顶位置放了一个0x90,然后才是buf,所以写payload时填充的长度要减一

warmup_csaw_2016

ret2text题目,这里直接给了system('cat flag.txt');

ciscn_2019_n_1

通过查看IDA Pro源码,只要将v1溢出到使v2为11.28125即可

1
2
if ( v2 == 11.28125 )
result = system("cat /flag");

先将11.28125转成16进制,注意小端存储,应该是0x41348000,加到payload上即可

1
2
3
4
5
6
7
8
9
10
import struct
def float_to_hex_bytes(f):
# 将浮点数打包成单精度浮点数的字节序列
b = struct.pack('f', f)
# 将字节序列转换成十六进制字符串
hex_str = b.hex()
return hex_str
ans = 11.28125
ans = float_to_hex_bytes(ans)
# 输出 00803441

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
2
if ( *(_QWORD *)&var[13] == 17LL )
system("/bin/sh");

重点在于var是个什么类型的数组,(_QWORD *)这个指针类型是多少位,在IDA Pro中点进var可以看到

1
2
.bss:00004060 ; _DWORD var[15]
.bss:00004060 var dd 0Fh dup(?) ; DATA XREF: main+28o

WORD 表示两字节(字)

_QWORD 是一个无符号 64 位整数的数据类型,通常用于表示 64 位的整数值

_DWORD 是一个无符号 32 位整数的数据类型,通常用于表示 32 位的整数值

所以数组是32位的,但在判断时是取64位(8个字节判断)


本着互联网开源的性质,欢迎分享这篇文章,以帮助到更多的人,谢谢!