DASCTF 2024暑期挑战赛
springboard本地环境调试之前一直不理解为什么有的题目会给几个文件,现在才知道可以用来方便协调本地和远程的环境的
这里需要使用patchelf这个工具
修改ld
1patchelf --set-interpreter ./ld.so ./pwn(路径和文件)
ld.so 是要修改的 ./pwn是本地文件名
修改libc
1patchelf --replace-needed libc.so.6 ./libc.so.6 ./pwn
解题思路检查
可以看出非栈上格式化字符串漏洞
来到printf函数
可以看到
1处可以泄露libc 同时也是返回地址的所在地
两个2处可以利用这样的链式关系修改任意位置的地址
具体的手搓格式化字符串点这里格式化字符串 | 鱼非愚 (yufeiyu33.github.io)
exp123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566from ...
[ZJCTF 2019]Login题解
这个题目主要考察了函数间的参数的的具体分析
先检查保护,有canary保护
在ida中静态分析一下
有个账号密码的输入和检查,漏洞一般就是在账号密码输入的地方
先运行看看什么情况
发现只要输入对了密码,就会出现这样的异常,在ida查看这个异常的函数
发现只要输入对了密码就会跳转到上面的函数
所以要来找找a1的来源
rax就是a1
也就是外面的&v7
点开
发现v7是rbp+var_18
rbp=rsp
在下面输入函数中
同样rbp=rsp
这两个函数见rsp的值是没有发生变化的
故可在密码处通过覆盖得到改变a1
计算偏移即可
0x60-0xf(2jctf_pa5sw0rd)-0x18=58
后面就是a1覆盖上bookdoor
exp1234567891011121314151617from pwn import *#p=process('./pwn')p=remote('node5.buuoj.cn',29903)elf=ELF('./pwn')bookdoor=0 ...
ret2dlresolve及例题
ret2dlresolveret2dlresolve主要是利用函数进行plt表进行动态链接的时候,通过一系列的跳转才能找到got表,就是利用的这个过程进行漏洞攻击
_dl_runtime_resolve函数调用参考:[原创]ROP高级用法之ret2_dl_runtime_resolve-二进制漏洞-看雪-安全社区|安全招聘|kanxue.com
首先用link_map访问.dynamic,分别取出.dynstr、 .dynsym、 .rel.plt的地址
.dynamic的地址加0x44的位置是.dynstr.dynamic的地址加0x4c的位置是.dynsym.dynamic的地址加0x84的位置是.rel.plt
.rel.plt + 参数reloc_index,求出当前函数的重定位表项Elf32_Rel的指针,记作rel
rel->r_info >> 8作为.dynsym的下标,求出当前函数的符号表项Elf32_Sym的指针,记作sym
.dynstr + sym->st_name得出符号名字符串指针
在动态链接库查找这个函数的地址,并且把地址赋值给* ...
pwn漏洞修复
pwn patch栈read 32
在push 18h处右击 点击Assemble 将18h改成正常的无溢出的长度就好了
read 6464位的也是同理
找到溢出的函数将长度改合理
格式化字符串32法一 :若有puts的plt把printf改成puts即可
法二:需要改一个函数无用的函数改成write函数
12345678910.text:080485C0 win proc near.text:080485C0 ; __unwind {.text:080485C0 push 20h ; ' ' ; n.text:080485C2 push eax ; buf.text:080485C3 push 1 ; fd.text:080485C5 call _write.text:080485CA ...
reverse-壳与脱壳
壳壳分为两类
压缩壳:
UPX ASPack PECompact RLPack NSPack
保护壳、
ASProtect Armadillo EXECryptor Themida
手动脱壳参考这篇【BUUCTF】 reverse 新年快乐_buuctf 文件加壳和脱壳-CSDN博客
格式化字符串
格式化字符串原理
在printf函数后面,若是存在%s %x %n$x类似的函数
就会读取栈上内存上的内容进行转化
利用 %x 来获取对应栈的内存,但建议使用 %p,可以不用考虑位数的区别
利用 %s 来获取变量所对应地址的内容,只不过有零截断
利用 %n$x 来获取指定参数的值,利用 %n$s 来获取指定参数对应地址的内容
原理:在做题时会进行对多个’[标记]%p’类似的是为了确定在栈上读取到相应位置的值
非栈上的格式化字符串
当我们的输入函数是把输入的放在bss段或者堆上面,就无法直接通过覆盖ebp进行溢出改变值了,这个时候我们就有其他的做题方法了
现在通过一道题目来解释这个方法
SWPUCTF_2019_login
像这样的这样 无法通过直接写道栈上
来到printf函数这里进行动态调试
因为格式化字符串改值需要利用上图中第一个红框和第二个红框这样的类似的链式结构来改写栈上面的地址
12345678910111213#泄漏libcpay = b'%15$p'io.sendlineafter("Please input your pa ...
LitCTF 2024 pwn ATM
先查看文件
托入ida进行查看
没有什么东西
可以看到首先有个死循环,就是不断的循环,让你选择不同函数作用
在图6可以读取到read这里有个明显的漏洞
接着我们要调节nbytes上面的参数
在图5上面的是把nptr的地址化为(unsigned int)接着下面的函数(第二个框)就把nbytes改变了
可以跑程序看一下
在3函数随便改变输入就可以造成nptr值的改变
接下来找一下偏移
可以看到偏移是0x160
接下来就可以编写脚本了
123456789101112131415161718192021222324252627282930313233343536373839from pwn import *from LibcSearcher import *context.log_level='debug'p=process('./app ...
SROP及例题
SROP使用条件
有时候函数没有输出函数,无法使用ret2libc(或者直接没有got表)
条件1.存在
123mov eax,0fhretn
这样的指令(系统调用号15)sigreturn
2.还有较长的读取空间
3.有syscall_ret
4.有/bin/sh(若没有则需要自己写入)
可以通过栈溢出来控制栈的内容需要知道相应的地址“/bin/sh”Signal Framesyscallsigreturn需要有够大的空间来塞下整个 sigal frame
基本原理
ctf-wiki上面有
总结一下就是调用了sigreturn后面程序会进入一个挂起的状态
然后将此时的状态压入栈中
然后在sigreturn中填写指令
最后程序会返回原来的状态
例题现在以一道例题来说明这个知识点
buu上面的ciscn_2019_s_3
先检查函数,64位,没有canary
再打开ida查看函数
发现有个gadgets
点进去看看
发现可以系统调用号15 可以使用SROP取得这一个题目的权限
先看函数
会打印出一串东西
动态调试看看
看到 ...
堆概述及其例题
堆概念
在stdlib的头文件中存在malloc函数和free函数
两个系统调用brk()
brk()是通过增加break location 来获取内存的,开始heap区域的起点start_brk和终点brk是指向同一个位置的,
ASLR关闭时,这两者都会指向data/bss 段的末端,就是下面的end_data
ASLR开启时,这两者会在data/bss段的末端加上一段随机的的brk偏移
溢出方式:堆是向上面溢出的
怎么一出到下面的空间:在32位的程序中通过整数溢出,超过这段空间时会从下面进行溢出
怎么增大空间的:第一次申请空间的时候就是把brk结束的标识符往上面进行移动
当brk方式增大的空间超过了一定的地方就变成了mmap()溢出了
mmap()用于创建私有的匿名映射段,主要是为了分配一块新的内存,并且这块内存只用调用mmap()的进程才可以使用,所以时私有的。与之相反的操作时munmap(),删除一段内存区域上面的映射
malloc 会使用 mmap()来创建独立的匿名映射段。匿名映射的目的主要是可以申请以 0 填充的内存,并且这块内存仅被调用 ...
bjdctf_2020_babyrop2题解
这题有canary保护
在ida中打开看看
这里的
1__isoc99_scanf("%6s", format);
有个格式化字符串漏洞
这里的read函数有个栈溢出
所以要想办法通过格式化字符串找到canary
又因为这里什么都没有,需要自己构造rop
进行ret2libc
开始找canary
找到了偏移量为6
找到了canary
因为canary一般以00结尾
然后根据栈溢出构造ret2libc就行了
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758from pwn import *from LibcSearcher import *context(log_level='debug')p=remote('node5.buuoj.cn',25455)#p=process('./bjdctf_2020_babyrop2' ...