adworld-re新手练习区
Posted theffth-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了adworld-re新手练习区相关的知识,希望对你有一定的参考价值。
RE
re1
下载得到exe文件,运行:
使用exeinfo分析,发现是32位无壳的exe,拖入IDA,f5反编译:
int __cdecl main(int argc, const char **argv, const char **envp) { int v3; // eax __int128 v5; // [esp+0h] [ebp-44h] __int64 v6; // [esp+10h] [ebp-34h] int v7; // [esp+18h] [ebp-2Ch] __int16 v8; // [esp+1Ch] [ebp-28h] char v9; // [esp+20h] [ebp-24h] ? _mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34)); v7 = 0; v6 = qword_413E44; v8 = 0; printf(&byte_413E4C); printf(&byte_413E60); printf(&byte_413E80); scanf("%s", &v9); v3 = strcmp((const char *)&v5, &v9); if ( v3 ) v3 = -(v3 < 0) | 1; if ( v3 ) printf(aFlag); else printf((const char *)&unk_413E90); system("pause"); return 0; }
追踪查看了unk_413E90中存放的内容是:flagget 所以v3运行结果应该是0,也即v5和v9中存放的东西相同;所以去找v5中的内容,发现:
_mm_storeu_si128((__m128i *)&v5, _mm_loadu_si128((const __m128i *)&xmmword_413E34));
猜测意思是将xmmword_413E34的内容赋值给v5,所以继续看xmmword_413E34的内容,得到flag:DUTCTF{We1c0met0DUTCTF}
注:
void _mm_storeu_si128(_m128i *p,_m128i a)
SSE指令,将_m128i变量a的值存储到p所指定的变量中
_m128i _mm_loadu_si128(_m128i *p)
SSE指令,返回寄存器中的值
game
打开题目,玩一会2333,好吧,玩是玩不出flag的,放入exeinfo,发现32位,拖入IDA,找到main主函数,f5反编译,发现全部变成1后,会执行sub_457AB4( )函数:
跟进它:
来到sub_45E940( )函数,发现关键部分:
写脚本跑一下:
list1=[] list2=[] file1 = open("1.txt",‘r‘) file2 = open("2.txt",‘r‘) file3 = open("3.txt",‘w‘) for line in file1: line=line.strip(‘ ‘) list11=line.split(‘=‘) list1.append(list11[1]) for line in file2: line=line.strip(‘ ‘) list12=line.split(‘=‘) list2.append(list12[1]) ? list3=[] for i in range(57): list3.append(int(list1[i])^int(list2[i])) file3.write(str(list3[i])) file3.write(‘ ‘) file1.close() file2.close() file3.close() list4=[] file4=open("3.txt",‘r‘) for line in file4: line=line.strip(‘ ‘) list4.append(line) for i in range(57): list4[i]=chr(int(list4[i])^0x13) print ‘‘.join(list4)
注:如果IDA不能正确的获得自定义函数的名字,那么IDA会用sub__加上自定义函数的起始地址来定义函数的名字
Hello,CTF
打开题目,IDA->f5,发现关键代码:
要求输入的字符串与v13相同且长度不超过17,题目提示不一定是明文比较,所以将v13十六进制转换成字符串:CrackMeJustForFun,也即flag
注:
int sprintf(char *string, char *format [,argument,...]);
说明:把格式化(format与其后数量不定的参数)的数据写入某个字符串缓冲区(string),有缓冲区溢出的可能,不安全
open-source
下载得到一个C源码,
将上面的参数值代入计算,得到flag.
Simple-unpack
exeinfo分析下载的文件:
Linux upx -d 脱壳,载入IDA发现flag.
logmein
exeinfo显示下载文件为64位ELF文件,拖入IDA,f5反编译:
要求flag长度应与v8相同,且每一位都是由v7和v8的对应字符异或得到,所以编写EXP:
v7="harambe" #重点! str=":"AL_RT^L*.?+6/46" flag=‘‘ for i in range(len(str)): flag += chr(ord(str[i])^ord(v7[i%7])) print flag
或者C++脚本:
#include <iostream> #include <cstring> typedef unsigned char BYTE; using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ ? int main(int argc, char** argv) { long long int v7=28537194573619560; char v8[18] =":"AL_RT^L*.?+6/46"; char s[18];//定义字符数组变量,char a[字符串长度+1]; int i; for(i=0;i<strlen(v8);i++) { s[i]=(char)(*((BYTE *)&v7+i%7)^v8[i]); } s[i]=‘