Ghira 其实我觉得和IDA 差不多吧
下载地址:
https://Ghidra-sre.org
需要又java 11+ 【我用的是java 11】
主要就不介绍了,用法感觉和IDA 差不多
我们先来写一个题【CTF】
该题来自 Bugku逆向 RE_Cirno
打开发现是一个.jpg的图片 。 图片肯定有问题啦。藏得有东西
用101打开看看
通过http://doc.chacuo.net/filehead 这个网址就能找到一些文件头的都行。然后再010里面可以搜索一下。
其实这一步也可以省略啦。直接用工具binwalk来查看这个JPG图片
很明显的看到,里面不只有这个jpg 还有一个zip的样子。
用binwalk -e 的命令把他搞出来。 就得到一个exe文件。
ok 现在就是再这个exe文件里面找到flag就好了
拿到文件。首先运行一下啦
从这里就可以看到
:琪露诺酱在冻青蛙的路上,突然被9层栅栏反方向围住了,找不到方向,你可以帮助她找到路吗? :请按任意键继续. . .
首先分析一下:“请按任意键继续. . .” 说明程序运行到这里就停下来了。然后你按下任意一个健就退出了..
我们来猜测一下这里肯定有一个暂停的功能
pause – 暂停
用IDA 打开
在main 里面就看到了这个pause 。 说明这里就是我们要分析的地方
看反汇编的代码
发现调用这个pause是xref 交叉应用..我们跳转过去
这里就是这个代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 .text:0040F459 68 A4 2F 42 00 push offset Command ; "pause" .text:0040F45E E8 DD FD FF FF call _system .text:0040F45E .text:0040F463 83 C4 04 add esp, 4 .text:0040F466 33 C0 xor eax, eax .text:0040F468 5F pop edi .text:0040F469 5E pop esi .text:0040F46A 5B pop ebx .text:0040F46B 81 C4 AC 00 00 00 add esp, 0ACh .text:0040F471 3B EC cmp ebp, esp .text:0040F473 E8 58 1D FF FF call __chkesp .text:0040F473 .text:0040F478 8B E5 mov esp, ebp .text:0040F47A 5D pop ebp .text:0040F47B C3 retn
这里调用了_system 和 __chkesp
伪代码看一下
发现就很奇怪…IDA7.7 和 7.0 编译出来的居然不一样….但是大致上又好像差不多…
有点蒙蔽。
而且在汇编代码中
1 .text:0040F466 33 C0 xor eax, eax
很明显又xor 但是这里又不管咋样的伪代码都没有….
这个很明显。这段的伪代码有问题….
难道只能看汇编代码了吗??
不,我们还有Ghira
很明显 这个Ghira 反编译出来的就是对的…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 void FUN_0040f350 (void ) { int iVar1; undefined4 *puVar2; undefined4 local_b0 [16 ]; uint local_70; uint local_6c; int local_68; int local_64 [24 ]; puVar2 = local_b0; for (iVar1 = 0x2b ; iVar1 != 0 ; iVar1 = iVar1 + -1 ) { *puVar2 = 0xcccccccc ; puVar2 = puVar2 + 1 ; } local_64[0 ] = 0x73 ; local_64[1 ] = 0x5e ; local_64[2 ] = 0x61 ; local_64[3 ] = 0x72 ; local_64[4 ] = 0x67 ; local_64[5 ] = 0x2f ; local_64[6 ] = 0x6b ; local_64[7 ] = 0x72 ; local_64[8 ] = 0x41 ; local_64[9 ] = 0x30 ; local_64[10 ] = 0x31 ; local_64[11 ] = 0x69 ; local_64[12 ] = 0x75 ; local_64[13 ] = 0x76 ; local_64[14 ] = 0x65 ; local_64[15 ] = 0x30 ; local_64[16 ] = 0x71 ; local_64[17 ] = 0x5f ; local_64[18 ] = 99 ; local_64[19 ] = 0x2f ; local_64[20 ] = 0x5c ; local_64[21 ] = 0x74 ; local_64[22 ] = 0x5d ; local_64[23 ] = 0x66 ; for (local_68 = 0 ; local_68 < 0x18 ; local_68 = local_68 + 1 ) { local_70 = local_64[local_68] + 9U ^ 9 ; local_6c = local_70; } FUN_00401150(&DAT_00422fac); FUN_0040f240("pause" ); local_64[23 ] = 0x40f478 ; __chkesp(); return ; }
看代码写c 这里的代码已经有反转字符串的意思了
1 2 3 4 5 6 7 8 9 10 11 #include <stdio.h> int main () { char a[] = {115 ,94 ,97 ,114 ,103 ,47 ,107 ,114 ,65 ,48 ,49 ,105 ,117 ,118 ,101 ,48 ,113 ,95 ,99 ,47 ,92 ,116 ,93 ,102 }; int i = 0 ; char b = NULL ; for (i = 23 ; i >=0 ; i--) { b = (a[i] + 9 ) ^ 9 ; printf ("%c" ,b); } return 0 ; }
最后得到这个字符串
由于题目中“琪露诺酱在冻青蛙的路上,突然被9层栅栏反方向围住了,找不到方向,你可以帮助她找到路吗?”
栅栏密码9次解密就好了
感觉这个Ghira确实安逸,能汇编和伪代码对应着看。比较巴士
然后这个。下次IDA有问题,伪代码奇奇怪怪的时候,就可以来找找Ghidra 或者 以后IDA和这个工具结合着看。