攻防世界re(1)

新手初来乍到,技术相当的菜,写这个只是为了记录一下自己的学习过程。如文章有写的不对的地方,还请见凉。

  • 题目来源:攻防世界

dmd-50

拿到程序,看了一下是elf文件,直接拖进IDA,F5查看主函数

攻防世界re(1)_第1张图片攻防世界re(1)_第2张图片攻防世界re(1)_第3张图片
攻防世界re(1)_第4张图片
main函数的结构很清晰,对输入的字符串进行MD5加密,通过一个If与程序中已存在的字符进行一个判断。
提取出780438d5b6e29db0898bc4f0225935c0 使用MD5解密
攻防世界re(1)_第5张图片
解密得到grape可以看到是一个双层解密,再将grape加密一个即可得到flag
攻防世界re(1)_第6张图片flag:b781cbb29054db12f88f08c6e161c199

Shuffle

拿到程序,同样是一个elf文件,扔进IDA用F5查看主函数
攻防世界re(1)_第7张图片攻防世界re(1)_第8张图片
这道题,真心不知道该怎么吐槽,本来还想分析一下下面的循环那个部分,但是后来直接把s~v48部分转换成字符串就得到答案了
flag:SECCON{Welcome to the SECCON 2014 CTF!}

re2-cpp-is-awesome

这个题目蒙的一看有点懵,一堆看不懂的自己,然后仔细看看发现是自己吓自己(hhhh),不难,比较简单
拿到程序,ELF文件,ubuntu下随意看了看,就是输入个字符串,然后看对不对
扔进IDA ,F5大法
攻防世界re(1)_第9张图片
直接截的主要部分,也做了点注释。整个程序的大致流程就是输入字符串,然后与程序中的字符串对比。
程序中的字符串的出处在这:off_6020A0[dword_60203C[v14]]
off_6020A0是一个字符串
dword_60203C是个数组
v14循环变量
然后就能解出来了
攻防世界re(1)_第10张图片
然后再ubuntu下试试,,OK了
在这里插入图片描述

crackme

拿到程序,检查一下是否有壳
攻防世界re(1)_第11张图片
有壳,然后拿了个脱壳机对应的脱壳机将壳脱掉
扔进IDA,F5大法
攻防世界re(1)_第12张图片
很简单的逻辑,就是拿我们输入的字符串与一个数组作一个异或运算,然后与程序中的一个数组对比。然后导出这两个数组,求flag

arg = [0x12,  0x04, 0x08,  0x14, 0x24,  0x5C, 0x4A,  0x3D,0x56,  0x0A, 0x10,  0x67, 0x00,  0x41, 0x00,  0x01, 0x46,  0x5A, 0x44,  0x42, 0x6E,  0x0C, 0x44,  0x72, 0x0C,  0x0D,0x40,  0x3E, 0x4B,  0x5F, 0x02,  0x01, 0x4C,  0x5E, 0x5B,  0x17, 0x6E,  0x0C, 0x16,  0x68, 0x5B,  0x12]

arg1 = [0x74, 0x68, 0x69, 0x73, 0x5F, 0x69, 0x73, 0x5F, 0x6E, 0x6F, 0x74, 0x5F, 0x66, 0x6C, 0x61, 0x67]
flag = ""
i = 0
while(i<42):
	flag+=chr(arg[i]^arg1[i%16])
	i+=1
	
print(flag)

在这里插入图片描述
ok!!

re-for-50-plz-50

这个题不难,如果见过MIPS指令的话,一会就分析出来了,没有的话还是要学习一下的
以下是关键部分代码以及一些分析

text:004013BC                 sw      $zero, 0x28+var_10($fp)  # 将0送入fp寄存器的0x28+var_10偏移处
.text:004013C0                 j       loc_401434
.text:004013C4                 move    $at, $at
.text:004013C8  # ---------------------------------------------------------------------------
.text:004013C8
.text:004013C8 loc_4013C8:                              # CODE XREF: main+A4↓j
.text:004013C8                 lui     $v0, 0x4A  # 'J'  # 将0x4A送入到v0的高16位
.text:004013CC                 addiu   $v1, $v0, (meow - 0x4A0000)  # 双击meow会发现他是前“cbtcqLUBChERV”这部分字符串
.text:004013CC                                          # 在加上0x4A后,v1中存储的是字符串的偏移量
.text:004013D0                 lw      $v0, 0x28+var_10($fp)  # 从fp寄存器的0x28+var_10偏移处取出一个字放入$v0寄存器,这里取出的是循环的i
.text:004013D4                 addu    $v0, $v1, $v0    # v0 = v1 + v0,此时v0里就是程序中字符串的首地址
.text:004013D8                 lb      $v1, 0($v0)      # 从v0寄存器的0偏移处取出一个字节放入v1寄存器中
.text:004013DC                 lw      $v0, 0x28+arg_4($fp)  # 从fp寄存器的0x28+arg_4偏移处取出一个字放入v0
.text:004013E0                 addiu   $v0, 4           # v0 = v0+4
.text:004013E4                 lw      $a0, 0($v0)      # 从v0寄存器的0偏移处取出一个字放入v1寄存器中
.text:004013E8                 lw      $v0, 0x28+var_10($fp)  # 从fp寄存器的0x28+var_10偏移处取出一个字放入$v0寄存器,这里取出的是循环的i
.text:004013EC                 addu    $v0, $a0, $v0    # v0 = a0+v0    此时v0是指向输入字符串中的字符(也就是根据i的值,指向字符中的各个位置)
.text:004013F0                 lb      $v0, 0($v0)      # 取字符送入到v0中
.text:004013F4                 xori    $v0, 0x37        # 将取出的字符与0x37异或
.text:004013F8                 sll     $v0, 24          # 左移24位
.text:004013FC                 sra     $v0, 24          # 右移24位(注意保留符号)
.text:00401400                 beq     $v1, $v0, loc_401428  # 如果v1 = v0则跳转

程序的思路就是对输入的字符串与0x37异或,然后与cbtcqLUBChERV[[Nh@_X^D]X_YPV[CJ进行比较,若全部符合则成功
求解即可

s = "cbtcqLUBChERV[[Nh@_X^D]X_YPV[CJ"
flag = ""
i = 0
while(i

另一种解法就是利用IDA的插件retdec,然后将MIPS指令反汇编,然后就很简单了

你可能感兴趣的:(攻防世界re)