mma-ctf-2nd-2016-reverse-box(gdb脚本的使用)

分析

mma-ctf-2nd-2016-reverse-box(gdb脚本的使用)_第1张图片

这题逻辑非常简单,只要输出对应着这个盒子下标输出即可。要求输出目标为

$ ./reverse_box $ {FLAG}

95eeaf95ef94234999582f722f492f72b19a7aaf72e6e776b57aee722fe77ab5ad9aaeb156729676ae7a236d99b1df4a

看起来非常简单,但是实际上有难点。就是每次的盒子是不一样的。跟进去看

mma-ctf-2nd-2016-reverse-box(gdb脚本的使用)_第2张图片

盒子的生成是一个由时间产生的随机数有关,但是所生成的随机数只有一个字节,也就是只有256种可能!因此可以遍历所有的表来查找结果。根据比赛提示,flag还是以TWCTF开头的。看特征

mma-ctf-2nd-2016-reverse-box(gdb脚本的使用)_第3张图片

这几个字符会生成固定的12个字符。

因此开始爆破

这里使用gdb脚本进行爆破

set $i=0
set $total=256
while($i<$total)
  b *0x80485b4
  b *0x8048704
  run T
  set $i=$i+1
  set *(char*)($ebp-0xc)=$i
  continue
  if ($eax==0x95)
    print $i, $i
    x/256xb $esp+0x1c
    set $i=256
  end
  stop
end

因为是第一次写,所以可能写的不好。但是最终好歹也是找到了正确的盒子。接下来就是对应着表来还原正确答案。

mma-ctf-2nd-2016-reverse-box(gdb脚本的使用)_第4张图片

再使用python脚本即可

a="	0xd6	0xc9	0xc2	0xce	0x47	0xde	0xda	0x70	0x85	0xb4	0xd2	0x9e	0x4b	0x62	0x1e	0xc3	0x7f	0x37	0x7c	0xc8	0x4f	0xec	0xf2	0x45	0x18	0x61	0x17	0x1a	0x29	0x11	0xc7	0x75	0x02	0x48	0x26	0x93	0x83	0x8a	0x42	0x79	0x81	0x10	0x50	0x44	0xc4	0x6d	0x84	0xa0	0xb1	0x72	0x96	0x76	0xad	0x23	0xb0	0x2f	0xb2	0xa7	0x35	0x57	0x5e	0x92	0x07	0xc0	0xbc	0x36	0x99	0xaf	0xae	0xdb	0xef	0x15	0xe7	0x8e	0x63	0x06	0x9c	0x56	0x9a	0x31	0xe6	0x64	0xb5	0x58	0x95	0x49	0x04	0xee	0xdf	0x7e	0x0b	0x8c	0xff	0xf9	0xed	0x7a	0x65	0x5a	0x1f	0x4e	0xf6	0xf8	0x86	0x30	0xf0	0x4c	0xb7	0xca	0xe5	0x89	0x2a	0x1d	0xe4	0x16	0xf5	0x3a	0x27	0x28	0x8d	0x40	0x09	0x03	0x6f	0x94	0xa5	0x4a	0x46	0x67	0x78	0xb9	0xa6	0x59	0xea	0x22	0xf1	0xa2	0x71	0x12	0xcb	0x88	0xd1	0xe8	0xac	0xc6	0xd5	0x34	0xfa	0x69	0x97	0x9f	0x25	0x3d	0xf3	0x5b	0x0d	0xa1	0x6b	0xeb	0xbe	0x6e	0x55	0x87	0x8f	0xbf	0xfc	0xb3	0x91	0xe9	0x77	0x66	0x19	0xd7	0x24	0x20	0x51	0xcc	0x52	0x7d	0x82	0xd8	0x38	0x60	0xfb	0x1c	0xd9	0xe3	0x41	0x5f	0xd0	0xcf	0x1b	0xbd	0x0f	0xcd	0x90	0x9b	0xa9	0x13	0x01	0x73	0x5d	0x68	0xc1	0xaa	0xfe	0x08	0x3e	0x3f	0xc5	0x8b	0x00	0xd3	0xfd	0xb6	0x43	0xbb	0xd4	0x80	0xe2	0x0c	0x33	0x74	0xa8	0x2b	0x54	0x4d	0x2d	0xa4	0xdc	0x6c	0x3b	0x21	0x2e	0xab	0x32	0x5c	0x7b	0xe0	0x9d	0x6a	0x39	0x14	0x3c	0xb8	0x0a	0x53	0xf7	0xdd	0xf4	0x2c	0x98	0xba	0x05	0xe1	0x0e	0xa3"
a=[int(a.split()[i],16) for i in range(len(a.split()))]
#print a
b="95eeaf95ef94234999582f722f492f72b19a7aaf72e6e776b57aee722fe77ab5ad9aaeb156729676ae7a236d99b1df4a"
b = [ord(i) for i in b.decode('hex') ]
#print b
flag=''
for i in b:
    flag+=chr(a.index(i))
print flag

这里注意只能使用python2,因为python3不支持decode了。

最后得到flag TWCTF{5UBS717U710N_C1PH3R_W17H_R4ND0M123D_5-B0X}

总结

这题确实是有不少收获的。当时一心在想如何执行一个elf中的一个函数呢,有查到IDC脚本里的AppCall,还有一些大佬给的unicorn方法等等,但是gdb脚本也没写过,就想着试试。一些简单的逻辑就可以完成爆破,非常好用。脚本里的命令基本都是Gdb里可以直接使用的,因此十分容易上手。

明日计划

  1. 做课程作业,开始接触那个病毒文件
  2. *ctf比赛

你可能感兴趣的:(学习记录,逆向工程)