Pwn record

用来记录一些pwn中的神奇的操作

1.Card simulator

procedure
运行一下会发现是个抽卡程序,只开启了NX保护

ida反编译后后发现这一段
image

意思好像就是关闭标准输出,也没太明白,似乎就是关闭标准输出后需要使用文件读写把信息带出来

plt表中有system函数

最后会给一次输入机会,溢出0x28字节,本想着用栈迁移

发现需要ebp+read+leave_ret+read的三个参数发现溢出给少了

看完wp发现是个神奇的操作,注意到sh的整数储存为26739

并且有5个整型分别记录抽取的每种类型的数量,且此处抽卡未限制次数,我们多次抽卡使得3星武器数目为26739,并将它作为system的参数

需要注意的是最后cat flag时需要重定向

Card simulator.exp

2.just_pwn

procedure

查看保护会发现只有NX没开,估计是个写shellcode的题目了

反编译试试

image

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

image

call完puts后把rbp+buf的地址赋给rax再赋给rsi,0x10赋给edx,0赋值给edi,至于为什么会出现edx,edi

之前好像看到过有64位程序的寄存器会比32位多一些功能?在不执行这些功能下和32位是可以等价的?

查看一下栈段

image

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前下个断点查看一下栈段

image

发现在read前的stack上储存了/bin/sh,这样我们在编写shellcode的时候是不需要处理写入的操作的,那么我们就能缩短shellcode的长度了,最后写出来15个字节加上\n刚好

exp

3.dota

procedure

ctfshow上的一道,以前调了很久没出,现在再做一遍

没啥难的地方,考了一些最基本的漏洞

ida反编译第一次输入dota,第二次利用整数上溢,进入firstblood后格式化字符串漏洞任意写

image

注意到把v1的地址以16进制打印出来了,后面printf把参数位置调整正确就行

最后利用read栈溢出泄露libc基地址

再次调用firstblood再走一遍流程,注意再次调用的时候栈的就够会发生变化,还是得接收一遍v1的地址

exp

4.CET4

procedure

通过这道题学习一些神奇的操作

检查保护只开了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的基地址即可

过程确实是有一点麻烦了😢

官方wp

posted @ 2022-03-15 18:35  hash_hash  阅读(67)  评论(0)    收藏  举报