这个比赛并不难,最后一个pwn的wp现在还没有。
pwn
whatsmyname
白给,gdb和ida都没用
1 | #! /usr/bin/env python |
wah
(白给,gdb和ida都没用)*2
1 | #!/usr/bin/env python |
really obnoxious problem
白给
1 | #! /usr/bin/env python3 |
dream
这个不用做了,本地出了,远程服务器给的时间太少,已经私聊了,人家在睡觉
已出actf{hav3_you_4ny_dreams_y0u'd_like_to_s3ll?_cb72f5211336}
主要就是一个sell的时候的UAF,但是限制了堆块大小,并且只能新建5个。这里把control chunk直接malloc出来从而让上述限制都失效了。
泄露libc是把一个堆块size位置改掉,然后释放掉(注意布置后面的堆块来通过unsortedbin的检查)之后show出libc。
然后任意地址写改free_hook。
1 | from pwn import * |
whereami
actf{i'd_be_saf3_and_w4rm_if_1_wa5_in_la_5ca5e33ff06f}
1 | from pwn import * |
parity
actf{f3els_like_wa1king_down_4_landsl1de_6d28d72fd7db}
无语题目,要我写奇偶交替的shellcode,把大伙都整笑了。
找gadget的方法我是用下面的脚本,就是暴力获取所有奇数偶数奇数的全排列指令,然后反汇编。
1 | oushu = [] |
之后用下面的命令disasm -c amd64 < bin > all_gadget
找到的gadget如下所示。
1 | 0: 00 01 add BYTE PTR [rcx], al |
(这里省略大概90万行)
之后就是在里面找有用的,没有什么技巧,全是感情(太累了!!)
注意这里比较麻烦的就是syscall
这条指令是\x0f\x05也不是奇偶相见的,因此也要通过加加减减构造。总之就是没什么意思的题目,现实中也完全碰不到。做一次也就够了
1 | from pwn import * |
caniride
这个题我觉得只能爆破..如果大家有更好的思路欢迎交流。
这个题特殊的地方在于,写格式化字符串的地方并不知道要写入的地址是多少
做不动了,下面的没法爆破,写不来爆破脚本,改一下能循环爆破就可以了。调试下来这个gadget是能用的,本地能出shell。
PS: 这道题赛后复现,确实有一种不用爆破的方法。例如下面的这样的payoad
%*20$x%16$hn%*21$x%17$hn%*22$x%18$hn%*23$x%19$hn
。其中的*表示这里写入多少数字的参数在后面。算是一种新学到的用法。不过这样要自己构造格式化字符串。用这里的get_shorts函数,也是比较方便的。
具体思路是劫持exit_got为main之后循环。最后劫持exit_got为one_gadget.
1 | from pwn import * |
逆向的wp,可见松神的博客