2020网鼎杯 逆向 signal

先分析一下程序
2020网鼎杯 逆向 signal
2020网鼎杯 逆向 signal
main函数进来是这样,__main()好像没什么用,之后把 0x403040位置的东西复制到v4变量,之后vm_operad函数又将v4传了进去。
先看一下 0x403040 位置是什么
2020网鼎杯 逆向 signal
是很多四字节为单位的数,之后会用到

2020网鼎杯 逆向 signal
进去 vm_operad 函数之后可以看见,之前传进来的 v4 现在是 a1 ,也就是 0x403040那个位置的数用a1来表示

2020网鼎杯 逆向 signal
2020网鼎杯 逆向 signal
粗略的看一下,有 what a shame 这样的字符串,所以应该是要比较字符

2020网鼎杯 逆向 signal
再仔细分析程序,switch 这里用的参数是 a1,也就是刚才 0x403040那部分,v10 相当于是索引,从0开始递增,进而遍历 0x403040之后的所有数(四字节为单位)。所以说 0x403040 这里面储存的都是操作数,然后一个一个取出来,看看是几然后找相应的case进行操作。

然后看一下这些个case都是干啥的:

2020网鼎杯 逆向 signal

  1. v4的某个位置 = v5
    v4是什么变量?往下找一找能发现,
    2020网鼎杯 逆向 signal
    在比较的时候,用的是 v4 和 a1 比较的,如果某一位不一样就 shame
    2020网鼎杯 逆向 signal
    而在0x403040这一大堆东西的最后可以看到,全是 07开头的操作数,那根据上面的case 7 里面的内容,可以判断出来操作数7就是用来比较的,然后用于比较的数储存在紧跟着 07 00 00 00 这四个字节后面的四个字节,然后如此循环十五次(一共有15个 07 00 00 00)

所以 v4 就是我们输入的用于比较的字符串呗,暂时理解为这样

2020网鼎杯 逆向 signal
2. 从a1 里面取数,和某个数做 加法 操作
2020网鼎杯 逆向 signal
3. 做减法操作

2020网鼎杯 逆向 signal
4.做异或操作

2020网鼎杯 逆向 signal
5.做乘法操作

2020网鼎杯 逆向 signal
6.什么都不做,索引 +1 (好像没有用到这个操作)

2020网鼎杯 逆向 signal
7.上面说的比较操作

2020网鼎杯 逆向 signal
8.没有实质操作,只是把索引+1,然后变量赋值,具体变量的意义仔细分析一下就可以看出来

2020网鼎杯 逆向 signal
10. read操作,点进去看一下
2020网鼎杯 逆向 signal
这就是运行程序停在的那个位置," string: "这里,,,这里是输入字符串,,长度必须是15,,然后返回
注意这个我们输入的字符串储存在 v3

2020网鼎杯 逆向 signal
11. 12. 分别是-1 和 +1 操作

先稍微在脑子里模拟几步

2020网鼎杯 逆向 signal
2020网鼎杯 逆向 signal
前几个操作数 0ah 04h 10h 08h 03h 05h 01h
0ah 是 十进制数的10,也就是read操作,v3 变量是输入的字符串的指针

04h 是异或操作,就是取当前的操作数 04h的下一个,也就是 10h, 把它与 v3[v9] 按位异或,v3是我们的输入,v9是它的索引,之后得到的值传入 v5 (v5相当于一个中间变量)

10h 被异或运算,v10 +2 ,所以跳过了 10h

08h 赋值操作,就是通过中间变量 v5 ,将 v3 中的某个字符改变。

03h 取下一个操作数做减法操作,下一个属是5 ,也就是 -5

05h 被用掉

01h 把做了操作,已经改变了的数传入 v4中,v4是最后取和标准字符串比较的字符串,,所以每次遇到 01h的时候,基本都是处理完了一个字符,然后处理下一个

之后的都类似,知道循环到 07h ,开始比较
2020网鼎杯 逆向 signal

把每个字符都做了相应操作之后,就开始比较了,也就是开始 07h 操作,比较的标准就是每一个 07 00 00 00 后面的四字节数

依次是 22h 3fh 34h 32h 72h 33h 18h ffffffa7h 31h fffff1h 28h ffff84h 1eh 7ah
所以按照标准字符串,然后把每个字符都逆着做一遍操作就行了,不过中间有几个很大的16进制,像是负数,,这个转化我也闹不清楚,所以在od里面看了一下
由于之前都是静态分析,只是到比较这一步开始动态,所以下断点就在 "what a shame " 这句话附近找,就是 07h 操作附近
2020网鼎杯 逆向 signal
能看到下断点那里就是关键的比较,因为下一个jmp就决定了是不是去 shame,也就是比较出错了

2020网鼎杯 逆向 signal
先是输入不对的15个数
之后到cmp断点那里
2020网鼎杯 逆向 signal
2020网鼎杯 逆向 signal
发现eax是 0x22 ,也就是标准的字符,所以我们输入的做了操作的数存在edx

知道这个之后就把可以逆出来的字符写上,然后不知道的四个字符打1,看一下那四个很大的16进制数在寄存器比较的时候是多少
2020网鼎杯 逆向 signal
结果还是很大的十六进制,但是我们输入的 ‘1’ 也变成了很大的十六进制,ff ff ff a6
在python里面验证一下,
2020网鼎杯 逆向 signal
行吧,那直接忽视那一堆f就行了把。。。
为啥会这样我也没明白过来,估计还要分析一下汇编,但是我水平有限就先这样了。。

2020网鼎杯 逆向 signal