攻防世界逆向高手题之serial-150
继续开启全栈梦想之逆向之旅~
这题是攻防世界逆向高手题的serial-150
下载附件,照例扔入exeinfope中查看信息:
.
.
64位ELF文件,无壳,照例扔入IDA64中查看伪代码信息,function窗口中没有main函数,看一下启动的start函数后发现main函数直接放在里面了:
.
.
(这里积累第一个经验)
但是双击跟踪又发现无法转成伪代码,后来查了资料发现了,这种代码和数据混合的就是花指令,在《IDA权威指南》中叫模糊指令。书上解释说IDA是静态反汇编,对于第一个红框中jz short near ptr loc_4009F3+2
无法执行加法指令,所以直接从loc_4009F3
处反汇编,一个指令错了,后面空间全部错误。
.
.
.
想起来还没有运行程序,现在运行一下程序,看一下主要回显信息:
.
.
在strings窗口双击跟踪,也只是回显到rdata段中,并没有什么太大的作用:
.
.
(这里积累第二个经验)
先跟着资料走一遍,动态调试,看程序跑起来之后,代码段里的数据会变成什么代码。因为没有代码参照,所以不知道断点下在那里,只能让它自己在输入暂停时下断点一步步调试(先按开始再按暂停):
.
.
.
.
(这里积累第三个经验)
然后F7和F8动态调试,7开头的代码好像是外部链接库的,4开头的代码才是当前程序真正地址。然后就是这里有个小插曲就是一直按F8或者一直按F7都会陷入7开头的地址的不断循环中,只有按一会F8再按一会F7后才能弹出下图的框中并跳出到4开头的真实地址中。(这里应该涉及反调试技术)
.
.
跳出来之后一直按F8即可,虽然有时候会跳回7开头的外部地址中,但是很快就会跳出来了。
.
.
注意这里F8单步执行中就算跳出到4开头的真实地址中也要自己按C键来转成代码,不然自己是不知道这里是关键代码的,图中这些代码就是按C键按出来的。然后这里鼠标悬停在第二个红框处说明我们输入的字符在这里开始操作,第三个红框说明我们输入的字符长度得是10h,也是是16位。
.
.
.
(这里积累第四个经验)
然后,然后就有意思了,很多博客说重新输入16
个字符然后重新调试,这太费时间了,代码都在这里了,直接自己协助IDA反汇编代码不就行了?前面满足16字符长后就跳转到后面一段代码中,后面取第一个字符与E比较,为什么是第一个呢,因为直接双击[rbp-200h]
即可看到栈了。
.
然后jz short near ptr loc_400A54+1
IDA是识别不了的,我们用U
取消对应代码段的定义,然后在400A55出用热键C
重新定义即可,重定义后前面jz short near ptr loc_400A54+1
会直接变成jz short near ptr loc_400A55
。
.
后面的代码基本都是确定前第n个字符,后面把该字符给到edx。然后取对应的倒数第n个字符,并把该字符给到eax,最后add eax, edx
和cmp eax, 9Bh
满足相加和即可。
.
.
.
所以最后不断的热键U和热键C不断修改jz short near ptr loc_400A7F+1
这类IDA识别不了的代码,即可得出flag:
EZ9dmq4c8g9G7bAV
.
.
.
.
(这里积累第五个经验)
后来查了很多资料,找到几个直接修改源汇编代码然后F5转伪代码的高手,其实他们也是在前面动态调试中发现逻辑代码之间的规律才能修补反汇编代码的。
下图中绿色框中jz
直接就跳过了,所以这部分代码是无用的,后面对输入flag
前第n
个字符和后第n
个字符的操作也是和绿框中一样隔了9
个字节的垃圾代码
,0x400A54
处的db 0
其实也是一条代码来的,只是被绿框中垃圾代码挤占了空间反汇编出错而已。
.
.
.
然而就算我们知道了真实代码和垃圾代码的间距,也在主函数中帮IDA把jz short near ptr loc_400A7F+1
这类指令一个个修改回来,我们还是不能F5
反汇编伪代码,因为代码中不能混有数据,所以我们必须把下图第二个第三个红框中的数据改成nop
空指令才行,这样一来工作量就大了。
.
.
所以我修改了别人一个IDC的脚本为IDApython嵌入脚本来用,脚本中0x400cac-0x40099c
是main函数的代码范围。0x05ebb866
是垃圾代码中mov ax, 5EBh
的机器指令,紧跟它后面的xor eax, eax机器指令是0xfa74c031
,以此来用for a in range(9):
填充间隔的9个Nop
addr=0x40099c
for i in range(0x400cac-0x40099c):
if Dword(addr+i)==0x05ebb866:
if Dword(addr+i+4)==0xfa74c031:
for a in range(9):
PatchByte(addr+i+a,0x90)
print('Done')
.
.
补充,用来脚本中用来判断界限的机器指令怎么看,直接热键U即可看到,从后往前,小端顺序:
.
.
结果:
.
.
再用热键C修改一些没识别数据指令:(不然会报错Your request has been put in the autoanalysis queue.
)
.
.
在main函数开头按创造函数的热键P即可创建函数,再按F5
即可创建伪代码
最后虽然很直观也很简单,但是这的确是要在前面动态调试的基础上才能写出脚本的。
.
.
.
.
总结:
1:
(这里积累第一个经验)
但是双击跟踪又发现无法转成伪代码,后来查了资料发现了,这种代码和数据混合的就是花指令,在《IDA权威指南》中叫模糊指令。书上解释说IDA是静态反汇编,对于第一个红框中jz short near ptr loc_4009F3+2
无法执行加法指令,所以直接从loc_4009F3
处反汇编,一个指令错了,后面空间全部错误。
2:
(这里积累第二个经验)
先跟着资料走一遍,动态调试,看程序跑起来之后,代码段里的数据会变成什么代码。因为没有代码参照,所以不知道断点下在那里,只能让它自己在输入暂停时下断点一步步调试(先按开始再按暂停)。
3:
(这里积累第三个经验)
然后F7和F8动态调试,7开头的代码好像是外部链接库的,4开头的代码才是当前程序真正地址。然后就是这里有个小插曲就是一直按F8或者一直按F7都会陷入7开头的地址的不断循环中,只有按一会F8再按一会F7后才能弹出下图的框中并跳出到4开头的真实地址中。(这里应该涉及反调试技术)
.
跳出来之后一直按F8即可,虽然有时候会跳回7开头的外部地址中,但是很快就会跳出来了。
.
注意这里F8单步执行中就算跳出到4开头的真实地址中也要自己按C键来转成代码,不然自己是不知道这里是关键代码的,图中这些代码就是按C键按出来的。然后这里鼠标悬停在第二个红框处说明我们输入的字符在这里开始操作,第三个红框说明我们输入的字符长度得是10h,也是是16位。
4:
(这里积累第四个经验)
然后,然后就有意思了,很多博客说重新输入11个字符然后重新调试,这太费时间了,代码都在这里了,直接自己协助IDA反汇编代码不就行了?前面满足16字符长后就跳转到后面一段代码中,后面取第一个字符与E比较,为什么是第一个呢,因为直接双击[rbp-200h]
即可看到栈了。
.
然后jz short near ptr loc_400A54+1
IDA是识别不了的,我们用U
取消对应代码段的定义,然后在400A55出用热键C
重新定义即可,重定义后前面jz short near ptr loc_400A54+1
会直接变成jz short near ptr loc_400A55
。
.
后面的代码基本都是确定前第n个字符,后面把该字符给到edx。然后取对应的倒数第n个字符,并把该字符给到eax,最后add eax, edx
和cmp eax, 9Bh
满足相加和即可。
5:
(这里积累第五个经验)
后来查了很多资料,找到几个直接修改源汇编代码然后F5转伪代码的高手,其实他们也是在前面动态调试中发现逻辑代码之间的规律才能修补反汇编代码的。
.
下图中绿色框中jz
直接就跳过了,所以这部分代码是无用的,后面对输入flag
前第n
个字符和后第n
个字符的操作也是和绿框中一样隔了9
个字节的垃圾代码
,0x400A54
处的db 0
其实也是一条代码来的,只是被绿框中垃圾代码挤占了空间反汇编出错而已。
.
.
然而就算我们知道了真实代码和垃圾代码的间距,也在主函数中帮IDA把jz short near ptr loc_400A7F+1
这类指令一个个修改回来,我们还是不能F5
反汇编伪代码,因为代码中不能混有数据,所以我们必须把下图第二个第三个红框中的数据改成nop
空指令才行,这样一来工作量就大了。
.
.
所以我修改了别人一个IDC的脚本为IDApython嵌入脚本来用,脚本中0x400cac-0x40099c
是main函数的代码范围。0x05ebb866
是垃圾代码中mov ax, 5EBh
的机器指令,紧跟它后面的xor eax, eax机器指令是0xfa74c031
,以此来用for a in range(9):
填充间隔的9个Nop
.
.
补充,用来脚本中用来判断界限的机器指令怎么看,直接热键U即可看到,从后往前,小端顺序:
.
.
再用热键C修改一些没识别数据指令:(不然会报错Your request has been put in the autoanalysis queue.
)
.
.
在main函数开头按创造函数的热键P即可创建函数,再按F5
即可创建伪代码
.
.
最后虽然很直观也很简单,但是这的确是要在前面动态调试的基础上才能写出脚本的。
解毕!敬礼!