DDCTF2018-黑盒破解


目标:输出Binggo字符串;

题型:只给可执行程序,逆向emulator,构造opcode,读取flag

main函数基本逻辑:

  • 输入长度大于10的password,输入前10个字符只能是字母或者数字
  • password组成一个文件名,所以易知password=48ee204317
  • 接下来输入Passcode,其存储在(v4+16)地址处,长度小于100
  • 然后进入一个Dispatcher函数中进行Passcode解析并执行相关函数
  • 如果byte_603F00=1,则输出Success(但这里不是重点,因为题目要求是输出Binggo字符串即可

1

对byte_603F00交叉引用跟踪到sub_40113D函数

  • 可以看出,经过三个函数的check,最终byte_603F00才能为1

对sub_40113D函数交叉引用跟踪失败,但是在数据段发现存储了很多函数的offset,可以猜测是VM逆向,Dispatcher则是分发该处的函数

查看main中byte_603F00上面的Dispatcher函数(经过分析得到的)

  • 相关操作看注释(其实最后一个if里面的逻辑可以判断是Dispatcher了
  • 第一个for循环处理每个Passcode字符,第二个for循环查找Passcode字符对应的操作
  • 我们输入的Passcode会当做byte_603900数组的下标,如果其该下标处byte_603900元素的值为9个opcode中的一个就会执行相关操作
  • 也可以看汇编代码逻辑图,上面的jnz则是第二个for循环里面的if判断逻辑,最下面的call eax则是去调用对应的函数

Dispatcher逻辑图

在第二个for下断,动态调试,得出opcode,以及对应的v2下标

  • 对上面的汇编逻辑图简单分析一下,可以得出c1为我们输入v2下标,al为opcode

将byte_603F00导出如下:

byte_603F00 = [
  0x02, 0x00, 0x00, 0x0E, 0x16, 0x54, 0x20, 0x18, 0x11, 0x45, 
  0x50, 0x59, 0x58, 0x53, 0x00, 0x08, 0x44, 0x2D, 0x46, 0x39, 
  0x00, 0x54, 0x42, 0x01, 0x3C, 0x0F, 0x00, 0x07, 0x17, 0x00, 
  0x56, 0x21, 0x00, 0x37, 0x6D, 0x2B, 0x2A, 0x6E, 0x59, 0x5D, 
  0x47, 0x3A, 0x4A, 0x34, 0x44, 0x48, 0x43, 0x6C, 0x3F, 0x59, 
  0x25, 0x33, 0x55, 0x2F, 0x31, 0x68, 0x27, 0x34, 0x7C, 0x28, 
  0x67, 0x59, 0x00, 0x52, 0x00, 0x26, 0x00, 0x3E, 0x56, 0x4E, 
  0x33, 0x21, 0x45, 0x6D, 0x60, 0x39, 0x46, 0x72, 0x6D, 0x4D, 
  0x54, 0x40, 0x00, 0x74, 0x57, 0x73, 0x72, 0x7A, 0x47, 0x45, 
  0x00, 0x71, 0x00, 0x4A, 0x35, 0x70, 0x3B, 0x36, 0x2E, 0x26, 
  0x2C, 0x6C, 0x4A, 0x00, 0x7C, 0x63, 0x35, 0x57, 0x4D, 0x41, 
  0x43, 0x62, 0x00, 0x68, 0x37, 0x00, 0x5A, 0x6A, 0x6B, 0x7C, 
  0x29, 0x69, 0x4C, 0x70, 0x50, 0x71, 0x26, 0x36, 0x3C, 0x06, 
  0x1B, 0x00, 0x3C, 0x30, 0x00, 0x00, 0x00, 0x4C, 0x0B, 0x4B, 
  0x48, 0x08, 0x54, 0x47, 0x12, 0x09, 0x24, 0x00, 0x00, 0x24, 
  0x40, 0x0D, 0x39, 0x06, 0x5C, 0x2C, 0x1A, 0x2D, 0x0A, 0x38, 
  0x35, 0x37, 0x16, 0x3B, 0x00, 0x24, 0x48, 0x00, 0x49, 0x00, 
  0x37, 0x08, 0x1F, 0x24, 0x45, 0x1D, 0x11, 0x40, 0x2F, 0x4A, 
  0x08, 0x15, 0x00, 0x11, 0x00, 0x1A, 0x22, 0x41, 0x52, 0x5B, 
  0x0B, 0x45, 0x31, 0x19, 0x43, 0x19, 0x1E, 0x0A, 0x21, 0x05, 
  0x4D, 0x59, 0x38, 0x34, 0x09, 0x36, 0x2F, 0x43, 0x02, 0x53, 
  0x12, 0x2F, 0x4C, 0x21, 0x0D, 0x3C, 0x31, 0x2E, 0x37, 0x08, 
  0x30, 0x29, 0x32, 0x2F, 0x00, 0x1A, 0x14, 0x41, 0x53, 0x15, 
  0x21, 0x00, 0x08, 0x13, 0x38, 0x5C, 0x36, 0x3B, 0x50, 0x00, 
  0x2F, 0x1E, 0x57, 0x00, 0x30, 0x2E, 0x0C, 0x2E, 0x37, 0x52, 
  0x1C, 0x33, 0x34, 0x11, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00
]

opcode如下:

opcode = [0x2A, 0x27, 0x3E, 0x5A, 0x3F, 0x4E, 0x6A, 0x2B, 0x28]

找到opcode在byte_603F00数组中的下标v2:

v2 = []
for i in opcode:
    v2.append(chr(ida_chars.index(i)))
print(x)
#v2 = ['$', '8', 'C', 't', '0', 'E', 'u', '#', ';']

再动态调试找到opcode对应的函数及作用:

"""
通过分析得知对应变量的含义
a1      ==> heap_addr
a1+16   ==> Passcode
a1+664  ==> next = Passcode[i+1]
a1+665  ==> byte  -- temp
a1+288  ==> DWORD -- str_index
a1+292  ==> DWORD -- str_len
a1+280  ==> DWORD -- 0x110
a1+8    ==> DWORD -- str --> "PaF0!&Prv}H{ojDQ#7v="

0::$ ==> sub_400DC1: temp = str[str_index]
1::8 ==> sub_400E7A: str[str_index] = temp
2::C ==> sub_400F3A: temp = temp + next - 33
3::t ==> sub_401064: temp = temp - next + 33  if !*(a1 + 665): ++temp 
4::0 ==> sub_4011C9: ++str_index
5::E ==> sub_40133D: check()
6::u ==> sub_4012F3:  --str_index  
7::# ==> sub_4014B9: {  
    if str_index < str_len and next - 48 < 41
        str[str_index] = Passcode[str_index + next - 48] - 49
}

8::; ==> sub_400CF1: { 
    str_index += next
    if next - 16 <= 89: 
        str[str_index] = Passcode[str_index + next - 48] - 49
}
"""

这里我们再回到sub_40113D这个函数,即对byte_603F00交叉引用跟踪到sub_40113D函数

  • 这里,就可以有想法了,我们的目标是输出Binggo,而这里输出str字符串,并且在上面可以看出:#对应的函数是可以修改str字符串的,所以我们只需要构造一个Passcode输入,把str字符串修改为Binggo即可,但是这里需要注意,str字符串长度为20比Binggo长度大,所以最后还有构造一个\x00去截断。

构造Passcode

"""
举一个例子:$t/80
$ ==> temp = str[0] =  'P'
t ==> temp = temp - next +33 = 'P' - next + 33,我们的目标是让temp为'B',所以 next = '/'
/
8 ==> str[0] = temp = 'B'
0 ==> str_index++ ==> str_index = 1,处理下一个字符
"""

最终脚本如下:

x = "PaF0!&Prv}H{ojDQ#7v="
t = "Binggo"
s = ""
for i in range(len(t)):
    s += "$"
    temp = ord(x[i]) - ord(t[i]) + 33
    if temp < 32: #必须为可见字符
        temp = ord(t[i]) - ord(x[i]) + 33
        s += "C"
    else:
        s += 't'
    s += chr(temp) + "80"
s += "#" + chr(len(s) + 3 + 48 - 7) + "1" #构造\x00截断
s += "uuuuuuEs" #通过u把str_index移动到str最开始的位置,并通过E进入check()函数,s则绕过*(a1 + 664) == 's'检查
print(s)
#s = "$t/80$C)80$CI80$CX80$Cg80$Cj80#J1uuuuuuEs"


文章作者: XiaozaYa
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 XiaozaYa !
  目录