后记:2020西湖论剑逆向babyre的wp

这个题目对我而言太难了,比赛的时候只做了个crypto简单题和逆向的flow,这个babyre没时间看,赛后花了2天才搞出来。
题目是个PE32的可执行程序,体积挺大的,调试的时候一直报非法指令,应该是有反调试的措施。
用x64dbg也是一样,看来动态调试这条路是走不通了,干脆耐心的分析代码。
首先根据报错,查到主程序逻辑是在sub_1543D0里:
在这里插入图片描述
这里是一个虚机,具体代码在开头会有初始化:
右边注释是我手工写的

0x01, 0x63, 0x00, load strings 0 & output
0x01, 0xF6, 0x01,  load strings 1 & output
0x02, 0x23, 0x33,  scanf
0x06, 0x11, 0xAC,  strlen
0x08, 0x06, 0xC3,  push 0x20
0x05, 0xE6, 0x2E,  memcmp
0x12, 0x03, 0xE2,  if = then continue
0x09, 0xBD, 0xEC,  pop
0x09, 0x23, 0x5C,  pop
0x09, 0x17, 0x2C,  pop
0x10, 0xF2, 0xED,  StringToDwordArray
0x04, 0xFF, 0x2A,  encrypt
0x08, 0x05, 0xAD,  push var5
0x05, 0x98, 0x7A,  strcmp
0x07, 0x03, 0x02,  if = then print

可以看到,最核心的是第4个功能模块,就是encrypt函数,让我们进去看下:
在这里插入图片描述
可以看到,这里有些数据插到函数中,而不是代码,后来再仔细分析启动过程,发现有这样的函数:
在这里插入图片描述
正常情况下程序不被调试是IsDebuggerPresent返回应该是0,就会进入sub_99C936:
在这里插入图片描述
看到这里就很明显了,是一个自调试的程序,代码中插入的数据都是"\xC7\x23"开头的,这里也有校验,同时会对执行的异常进行处理,再查到异常处理的函数:
在这里插入图片描述
函数基本功能是取异常时的上下文,同时读取异常时的指令字节,根据第三个字节来进行不同的操作,同样又是虚拟机!
经过一番耐心的分析(手撸~),得到之前报错sub_9a6f70函数的虚拟代码:

edi=输入内容转dword数组
loc_156F96:
C7230DD0		push edx
C7230CE0		pop  eax
C7230DE0		push eax
C7230CF0		pop  ebx
C7231701000000	push 1
C7230CB0		pop  esi
C7230EF0B0		add  ebx,esi
C7230DE0		push eax
C72326			pop dword1;push edi+dword1*4
C7230CE0		pop  eax
C7230DF0		push ebx
C72326			pop dword1;push edi+dword1*4
C7230CF0		pop  ebx
C7231DE0F0		xor  eax,ebx
C7230DE0		push eax
C7230DD0		push edx
C7231F			pop dword1;pop [edi+dword1*4]
C7230ED0B0		add  edx,esi

 cmp     edx, 1Fh
 jnz     short near ptr loc_156F96
 push    4
 mov     eax, [ebp+8]
 push    eax
 call    sub_14BA3B
 add     esp, 8

C7230DE0		push eax
C72317EFBEADDE	push 0xdeadbeef
C7230CE0		pop  eax
C7230EE0E0		add  eax,eax
C7230FE0E0		sub  eax,eax
C7230DF0		push ebx
C7231714451100	push 0x00114514
C7230CF0		pop  ebx
C72313E0F0		or   eax,ebx
C72342E0		not  eax
C72310E0F0		mul  eax,ebx
C72314F0E0		ebx%=eax
C72312E0F0		and  eax,ebx
C7230CF0		pop  ebx
C7230CE0		pop  eax

后一部分没啥用,应该就是增加逆向的工作量,前面一部分逻辑就是

for i in range(31):
    flag[i]^=flag[i+1]

然后进入加密的核心了(激动~,其实里解开题还早)
在这里插入图片描述
sub_99C5EE是核心中的核心:
在这里插入图片描述
居然还TM有伪代码,继续分析,详细代码我就不贴了,太长,基本逻辑就是分四轮把32个输入的字节转成每轮两个dword数,然后用两个随机种子0xDEADBEEF和0xAA114514产生2个随机数,对其进行加密,其中还有最大的一段伪代码写的加密处理部分enc2,最后根据逻辑写出exp如下:

def enc1(x,y,z):
    v5=((x<<z%32)^x^(x>>y%32))&0xffffffff
    v6=(v5^z^(y&v5|~v5))&0xffffffff
    v7=(v6^y^(z&v6|~v6))&0xffffffff
#    print(hex(x),hex(y),hex(z),hex(v5),hex(v6),hex(v7))
    return v7

def enc2(x,y,z):
    v5=x^y^z
    v6=(v5<<((y+z)%32)|v5>>(32-((y+z)%32)))&0xffffffff
    v7=(v6^(v6&(v6>>1)))&0xffffffff
#    print(hex(x),hex(y),hex(z),hex(v5),hex(v6),hex(v7))
    return v7

def swap(x):
  x = (2 * (x & 0x55555555) | ((x & 0xAAAAAAAA) >> 1))&0xffffffff
  x = (4 * (x & 0x33333333) | ((x & 0xCCCCCCCC) >> 2))&0xffffffff
  x = (16 * (x & 0xF0F0F0F) | ((x & 0xF0F0F0F0) >> 4))&0xffffffff
  x = (((x & 0xFF00FF) << 8) | ((x & 0xFF00FF00) >> 8))&0xffffffff
  x = ((x << 16)| ((x & 0xFFFF0000) >> 16))&0xffffffff
  return x

a=0xdeadbeef
b=0xaa114514
t0=[]
t1=[]
for i in range(512):
    t0.append(a)
    t1.append(b)
    v11=0
    for j in range(32):
        v11^=(a&(1<<j))>>j
    a=(v11^2*a)&0xffffffff
    v11=0
    for j in range(32):
        v11^=(b&(1<<j))>>j
    b=(v11^2*b)&0xffffffff

result=[0x31, 0x86, 0x5F, 0xDF, 0xD5, 0x56, 0x45, 0x71, 0x12, 0x5F, 0x7A, 0xD9, 0xBF, 0xBC, 0x59, 0x12, 0xCD, 0x43, 0xCA, 0xDC, 0xF4, 0xB3, 0x53, 0xA6, 0xFA, 0x8E, 0x89, 0x1A, 0x74, 0xFC, 0x03, 0x16]
flag=[]
for j in range(4):
    v0=(result[3+8*j]<<24)+(result[2+8*j]<<16)+(result[1+8*j]<<8)+result[8*j]
    v1=(result[7+8*j]<<24)+(result[6+8*j]<<16)+(result[5+8*j]<<8)+result[4+8*j]
    for i in range(511,-1,-1):
        a=t0[i]
        b=t1[i]
        v1=swap(v1)
        v0=swap(v0)
        if i%128>0:
            v3=enc1(v1,a,b)
        else:
            v3=enc2(v1,a,b)
        v4=v0^v3
        v0=v1
        v1=v4
#    print(hex(v0),hex(v1))
    flag.append(v0&0xff)
    flag.append((v0>>8)&0xff)
    flag.append((v0>>16)&0xff)
    flag.append((v0>>24)&0xff)
    flag.append(v1&0xff)
    flag.append((v1>>8)&0xff)
    flag.append((v1>>16)&0xff)
    flag.append((v1>>24)&0xff)

for i in range(31):
    flag[30-i]^=flag[31-i]
print(''.join(chr(i) for i in flag))

运行结果
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:有时候我们外部引用的代码虽然导入idea并没有报错,但是一启动就会爆出ava 非法字符 \ufeff的问题,是由于idea在编译期间字符集乱码 这时首先先点击右下角的字符编码先换成GBK 点击convent 再换成utf-8 再次点击convent 点击运行代码即可运行。 引用\[2\]:解决方案2:整个项目出问题 点击Settings->搜索File Encoding 查看是不是编码有问题如图:然后File->New Projects Settings->Settings For New Projects->搜索File Settings ,做同样修改执行方案1,吧出问题的java代码页修改,然后一切正常。 后记 : 。 引用\[3\]:corpinfobean corp_info = (corpinfobean)session.getattribute("corp_info_" + sid);//从服务器session中获取corpinfobean类型的corp_info_xxx对象信息,赋值给变量corp_info,xxx表示获取到的sid值。 。 问题:java: 非法字符: \uff1b 回答: 当在Java代码中出现java: 非法字符: \uff1b的错误时,通常是因为代码中包含了Unicode字符 \uff1b,它代表的是全角分号(;)。这个错误可能是由于编码问题导致的。可以尝试以下解决方案来解决这个问题: 1. 检查代码中是否存在全角分号(;),将其替换为半角分号(;)。 2. 检查IDE的字符编码设置,确保字符编码与代码文件的编码一致。可以在IDE的设置中搜索字符编码,查看是否需要进行修改。 3. 如果是在使用IDEA进行开发,可以尝试点击右下角的字符编码,将其先换成GBK,再换成UTF-8,然后重新运行代码。 4. 如果是整个项目出现问题,可以在IDE的设置中搜索文件编码,查看是否需要进行修改。可以尝试修改出问题的Java代码文件的编码,然后重新运行代码。 希望以上解决方案能够帮助您解决java: 非法字符: \uff1b的问题。 #### 引用[.reference_title] - *1* [解决java 非法字符 \ufeff的问题](https://blog.csdn.net/xiaobaixuedaima/article/details/122080066)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Java-IDEA错误-Error: java: 非法字符: ‘\ufeff‘ Error: java: 需要class, interface或enum](https://blog.csdn.net/gaogzhen/article/details/107348314)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [java新手求问以下错误是什么意思](https://blog.csdn.net/weixin_33304686/article/details/114754197)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值