新手初来乍到,技术相当的菜,写这个只是为了记录一下自己的学习过程。如文章有写的不对的地方,还请见凉。
拿到程序,看了一下是elf文件,直接拖进IDA,F5查看主函数
main函数的结构很清晰,对输入的字符串进行MD5加密,通过一个If与程序中已存在的字符进行一个判断。
提取出780438d5b6e29db0898bc4f0225935c0 使用MD5解密
解密得到grape可以看到是一个双层解密,再将grape加密一个即可得到flag
flag:b781cbb29054db12f88f08c6e161c199
拿到程序,同样是一个elf文件,扔进IDA用F5查看主函数
这道题,真心不知道该怎么吐槽,本来还想分析一下下面的循环那个部分,但是后来直接把s~v48部分转换成字符串就得到答案了
flag:SECCON{Welcome to the SECCON 2014 CTF!}
这个题目蒙的一看有点懵,一堆看不懂的自己,然后仔细看看发现是自己吓自己(hhhh),不难,比较简单
拿到程序,ELF文件,ubuntu下随意看了看,就是输入个字符串,然后看对不对
扔进IDA ,F5大法
直接截的主要部分,也做了点注释。整个程序的大致流程就是输入字符串,然后与程序中的字符串对比。
程序中的字符串的出处在这:off_6020A0[dword_60203C[v14]]
off_6020A0是一个字符串
dword_60203C是个数组
v14循环变量
然后就能解出来了
然后再ubuntu下试试,,OK了
拿到程序,检查一下是否有壳
有壳,然后拿了个脱壳机对应的脱壳机将壳脱掉
扔进IDA,F5大法
很简单的逻辑,就是拿我们输入的字符串与一个数组作一个异或运算,然后与程序中的一个数组对比。然后导出这两个数组,求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)
这个题不难,如果见过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指令反汇编,然后就很简单了