Pwn record
用来记录一些pwn中的神奇的操作
1.Card simulator
procedure
运行一下会发现是个抽卡程序,只开启了NX保护
ida反编译后后发现这一段

意思好像就是关闭标准输出,也没太明白,似乎就是关闭标准输出后需要使用文件读写把信息带出来
plt表中有system函数
最后会给一次输入机会,溢出0x28字节,本想着用栈迁移
发现需要ebp+read+leave_ret+read的三个参数发现溢出给少了
看完wp发现是个神奇的操作,注意到sh的整数储存为26739
并且有5个整型分别记录抽取的每种类型的数量,且此处抽卡未限制次数,我们多次抽卡使得3星武器数目为26739,并将它作为system的参数
需要注意的是最后cat flag时需要重定向
2.just_pwn
查看保护会发现只有NX没开,估计是个写shellcode的题目了
反编译试试

额,说什么1257的位置分析失败,不管了直接看汇编

call完puts后把rbp+buf的地址赋给rax再赋给rsi,0x10赋给edx,0赋值给edi,至于为什么会出现edx,edi
之前好像看到过有64位程序的寄存器会比32位多一些功能?在不执行这些功能下和32位是可以等价的?
查看一下栈段

read从buf这个地方开始写不超过16个字节
最后会调用写在此处的内容
所以我们需要写一个不超过16字节的shellcode来getshell
我们调用shellcraft.sh()看看生成了什么
/* execve(path='/bin///sh', argv=['sh'], envp=0) */
/* push b'/bin///sh\x00' */
push 0x68
mov rax, 0x732f2f2f6e69622f
push rax
mov rdi, rsp
/* push argument array ['sh\x00'] */
/* push b'sh\x00' */
push 0x1010101 ^ 0x6873
xor dword ptr [rsp], 0x1010101
xor esi, esi /* 0 */
push rsi /* null terminate */
push 8
pop rsi
add rsi, rsp
push rsi /* 'sh\x00' */
mov rsi, rsp
xor edx, edx /* 0 */
/* call execve() */
push SYS_execve /* 0x3b */
pop rax
syscall
发现汇编指令的前面一半都是在写入/bin/sh,长度为48字节
想起来自己之前好像见到过短的shellcode但是好像也有个20字节的样子,应该会有什么不一样的地方
gdb调试在read前下个断点查看一下栈段

发现在read前的stack上储存了/bin/sh,这样我们在编写shellcode的时候是不需要处理写入的操作的,那么我们就能缩短shellcode的长度了,最后写出来15个字节加上\n刚好
3.dota
ctfshow上的一道,以前调了很久没出,现在再做一遍
没啥难的地方,考了一些最基本的漏洞
ida反编译第一次输入dota,第二次利用整数上溢,进入firstblood后格式化字符串漏洞任意写

注意到把v1的地址以16进制打印出来了,后面printf把参数位置调整正确就行
最后利用read栈溢出泄露libc基地址
再次调用firstblood再走一遍流程,注意再次调用的时候栈的就够会发生变化,还是得接收一遍v1的地址
4.CET4
通过这道题学习一些神奇的操作
检查保护只开了NX和部分RELRO
ida反编译,发现一个叫sandbox的函数
即沙盒保护(机制介绍)
之前有见过一次orw类的题目(在被禁用execve的系统调用后利用open,read,write打印flag的操作)
可使用seccomp-tools dump ./XXX来查看哪些函数允许调用
我们可以发现这道题只禁用了execve的系统调用
我们可以使用orw的方式
但是在开启NX保护下如何执行呢
利用mprotect函数修改指定内存区域保护属性
注意到我们最后执行read需要调用三个参数,那么需要找到pop rdi,pop rsi以及pop rdx,实际上我们查找ROPgadget的时候只找到了pop rdi的地址其他两个都会影响其他寄存器的值
所以我们考虑从他所给的libc中找,最后加上libc的基地址即可
过程确实是有一点麻烦了😢

浙公网安备 33010602011771号