安洵杯20Debugging WP

本文围绕逆向分析展开,作者尝试通过修改rip进行调试。分析了多个函数,包括假main函数、neww函数等,发现隐藏函数和假函数的实现方式。还分析了blowfish算法,完成其初始盒设置。最后梳理出输入经blowfish、hexlify、逆转、加数值后进行比较的流程,并写脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前一直不知道怎么做,因为这几天做的题一直用到修改rip,所以突发奇想,看看能不能这道题也修改rip来动调到主函数(因为之前其实我是找到了可以断下来的点以及无法动调却调用的地方)

image-20210513142437697

先是输入34个字符赋给v4,之后v4进行相邻两位的xor,然后进入sub14001142e

一顿下来,发现如此简单是必不可能的

这是个假main函数,根本没地方调用它……

image-20210513144451147

问题就是这里将rip改成了sub1400113a7

image-20210513144732934

加上这里根本无法f7

修改rip虽然无法使它正常调试,但是还能看看函数作用的

image-20210513145209368

image-20210513145222638

进入neww函数

image-20210513145453699

v7,v8,v9和后面sub1400110fa的第一个参数都是地址,g转到地址,找到内容,发现v7是base64转换表,v8一段无规则码,v9是flag{i_am……}

动调出来发现sub1400110fa将flag{}变成了一段字符,很明显是将它按字母顺序重排序

下面部分,没看出来也感觉不太重要,先放放

image-20210513150230508

分析下个函数

image-20210513150318923

image-20210513150357315

这里v8运算下来竟然是input:

image-20210513150729998

image-20210513150749548

image-20210513150803791

image-20210513150821482

image-20210513150834985

image-20210513150845959

image-20210513150900677

多截几幅图来表达我内心的卧槽……菜鸡第一次见到这样的隐藏函数和假函数,原来是这样实现的,学会了!

所以这个函数是print(input)

image-20210513151201076

分析这个函数

image-20210513151236831

有一个cin,cin下面经分析是blowfish

image-20210513151308138

image-20210513151334019

image-20210513151346295

可以看到有点像blowfish的sbox,pbox,但是每个的最后两位又不一样

image-20210513152036287

key=who_am_i

接着分析

image-20210513151444088

image-20210513151500299

看看byte140021150

image-20210513151627225

这特征,太像vm了

所以总体流程是

AE345B3B45CA8CEED7DD35F7D11C0704

从头分析各个函数

startAddress:

image-20210517193434973

v12通过地址的运算变成了blowfish不标准s_box的首地址,动调发现s_box变成了正宗的s_box

image-20210517193323311

image-20210517193750478

p_box同理

经此,完成了blowfish的初始盒

然后经过了输出input→输入flag→blowfish(key=who_am_i )→vm

动调vm部分

重复的部分很多,直接断点f9看rax,直到变化再步入看函数

image-20210517205606755

这里我因为是修改rip,所以我的cin_str的数据都为0,为了方便调试,我把它的数据也改了

image-20210517212229128

case1:

image-20210517212628613

image-20210517212614282

这样看得可能不是很明白,r一下,

image-20210517212726795

将输入的字符进行hexlify

case5:

将v8=3f值置零

然后会发现不停的44-3和33-3,一直调到switch(v5)

image-20210517213448681

会发现在57前都逆转了一下,逆转了32个字符串,与v8最大到3f对应

接下来会有几个循环

30,3,30,3,30,3,30,3,5f,9,d,6循环

当rax=d时,记录RDX数据

49,102,49,53,53,53,101,49,50,99,56,98,48,51,54,57

调试下来,发现经过case d发生改变

image-20210518013315931

当v8=0x350时

image-20210518013730331

步过后

image-20210518013755256

35+50=85

42+3=45

记录v8的数值

0x00c4, 0x0330, 0x024c, 0x0350, 0x0424, 0x04f8, 0x0b0c, 0x0620,0x0708, 0x0f78, 0x09a0, 0x1260, 0x09c0, 0x0b28, 0x0ca8, 0x0e40

8,6循环,edx不停数据更新

image-20210517220309262

dump出栈数据

unsigned char ida_chars[] ={

246, 50, 99, 53, 148, 55, 101, 54, 175, 55,

53, 56, 135, 104, 49, 57, 84, 57, 48, 101,

89, 59, 101, 97, 64, 111, 57, 51, 130, 108,

56, 57, 64, 104, 56, 49, 218, 63, 51, 55,

214, 57, 49, 54, 153, 66, 101, 102, 248, 64,

100, 50, 97, 60, 55, 55, 224, 61, 51, 100,

113, 113, 54, 48};

3,63循环

case63:

image-20210517221417187

image-20210517221113660

a2=rdx,与变化后的cin作比较,相等a3+1

记录出rdx数据

0x356332F6,0x36653794,0x383537AF,0x39316887,0x65303954,0x61653B59,0x33396F40,0x39386C82,0x31386840,0x37333FDA,0x363139D6,0x66654299,0x326440F8,0x37373C61,0x64333DE0,0x30367171

就是前面8—6循环的分组

走到34,发现输出了error

image-20210517221631394

case34:判断之前的a3是否等于16

流程:输入→blowfish→hexlify→逆转→加数值→比较

写脚本

from binascii import unhexlify
from Crypto.Cipher import Blowfish
import codecs

compare=[0x356332F6,0x36653794,0x383537AF,0x39316887,0x65303954,0x61653B59,0x33396F40,0x39386C82,0x31386840,0x37333FDA,0x363139D6,0x66654299,0x326440F8,0x37373C61,0x64333DE0,0x30367171]

plus=[0x00c4, 0x0330, 0x024c, 0x0350, 0x0424, 0x04f8, 0x0b0c, 0x0620,0x0708, 0x0f78, 0x09a0, 0x1260, 0x09c0, 0x0b28, 0x0ca8, 0x0e40]

for i in range(16):
	compare[i]-=plus[i]
	#print(hex(compare[i]))

result = []
for a in range(16):
	for i in range(4):
		result.append(compare[a]>>(i*8)&0xff)

result=result[::-1]

result = bytearray(result)
#print(result)
key="who_am_i"
def Decrypt(enc,key):
        key=key.encode("utf-8")
        cl = Blowfish.new(key, Blowfish.MODE_ECB)
        ciphertext = codecs.decode(enc, 'hex_codec')
        code = cl.decrypt(ciphertext)
        return code
flag = Decrypt(result, key)
print(flag)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值