BUU mrctf shit

本文讲述了作者在遇到反调试挑战时,如何通过接管程序、下断点和动调技巧,逐步解析一个加密函数的工作原理,涉及输入函数定位、自修改EIP处理和复杂数据操作。

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

吐槽:去年没写出的题,现在终于可以上手了,昂哥nb

  1. 动调发现直接卡着不动了,怀疑是反调试,果然有好几处反调试

  2. 这里选择就不先nop了,先让程序跑起来,然后attach,在输入函数下面下个断点,attach可以理解成接管了程序的运行,个人理解
    所以eip会停在输入函数的里面,我们需要在输入函数下面下断就ok了。
    emmm,下面的反调试已经被我nop掉了,并且发现这个函数已经被hook掉了,然后会陷入死循环,好家伙

  3. 然后开始动调,花指令动调的话,就不用去了,我尝试去,发现挺麻烦的,尤其是这个自修改的eip,还是动调方便
    来到这两个函数,第一个函数跟进去,f7半天,不要f8,f8会直接退出,毕竟这个和常规栈帧还是有区别的!,没啥用,第二个才是重点

  4. f7进去第二个函数进行分析,纯看汇编,苦力活
    计算长度
    将4个字节,小端排序,改成大端
    将前面的结果左移32-某数组[i]的值和前面的值左移某一数组的[i]想与
    后面还有一些移位,就不多阐述了,看汇编就懂了,耐心点
    后面就是前面一个和后面一个每4个字节进行相异或。

  5. exp

c=[0x8C2C133A, 0x0F74CB3F6, 0x0FEDFA6F2, 0x0AB293E3B, 0x26CF8A2A, 0x88A1F279]
k=[3, 16, 13, 4, 19, 11]
t=[]
p=[]
t.append(0x8C2C133A)
for i in range(5):
    t.append(c[i]^c[i+1])
print(t)
for i in range(6):
    temp=t[i]^(1<<k[i])
    temp=(temp>>16)&0xffff|(~(temp<<16)&0xffff0000)
    temp=((temp<<k[i])|(temp>>(32-k[i])))&0xffffffff
    p.append(str(hex(temp)))
print(p)
for i in p:
    print(chr(eval("0x"+i[2:4]))+chr(eval("0x"+i[4:6]))+chr(eval("0x"+i[6:8]))+chr(eval("0x"+i[8:10])),end="")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值