拖进IDA
直接F5
查看见源代码
shift+F12
查看main函数的字符串得到flag
一道python逆向题
我们下载附件得到pyc
文件
(pyc文件就是 py程序编译后得到的字节码文件)
安装uncompyle6
uncompyle6 test.pyc > test.py
得到py文件
一个简答的加密函数,编写解密函数即可得到flag~
F5查看源代码
由于大一学的c语言,很久没用了,忘得差不多了,这儿记录一下函数的意义
strcpy就是复制字符串的意思
memset(str,’$’,7);将str的前7个字符变为’$’
put就是打印的意思
scanf读取输入
strcmp比较字符串
strcat截取字符串
就是和一个16进制的字符串对比
即输入CrackMeJustForFun,则success,所以flag就是为CrackMeJustForFun
。
拿到一段c语言的源代码
#include
#include
int main(int argc, char *argv[]) {
if (argc != 4) {
printf("what?\n");
exit(1);
}
unsigned int first = atoi(argv[1]);
if (first != 0xcafe) {
printf("you are wrong, sorry.\n");
exit(2);
}
unsigned int second = atoi(argv[2]);
if (second % 5 == 3 || second % 17 != 8) {
printf("ha, you won't get it!\n");
exit(3);
}
if (strcmp("h4cky0u", argv[3])) {
printf("so close, dude!\n");
exit(4);
}
printf("Brr wrrr grr\n");
unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;
printf("Get your key: ");
printf("%x\n", hash);
return 0;
}
成语编译的时候会出错,记得加上#include
就可以了
然后编译成exe文件g++ 8b6405c25fe447fa804c6833a0d72808.c -o cc.exe
直接拖进IDA,以二进制的方式打开然后SHIFT+F12
,就能看见flag
void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
{
size_t v3; // rsi
int i; // [rsp+3Ch] [rbp-54h]
char s[36]; // [rsp+40h] [rbp-50h]
int v6; // [rsp+64h] [rbp-2Ch]
__int64 v7; // [rsp+68h] [rbp-28h]
char v8[8]; // [rsp+70h] [rbp-20h]
int v9; // [rsp+8Ch] [rbp-4h]
v9 = 0;
strcpy(v8, ":\"AL_RT^L*.?+6/46");
v7 = 28537194573619560LL;
v6 = 7;
printf("Welcome to the RC3 secure password guesser.\n", a2, a3);
printf("To continue, you must enter the correct password.\n");
printf("Enter your guess: ");
__isoc99_scanf("%32s", s);
v3 = strlen(s);
if ( v3 < strlen(v8) )
sub_4007C0(v8);
for ( i = 0; i < strlen(s); ++i )
{
if ( i >= strlen(v8) )
((void (*)(void))sub_4007C0)();
if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )
((void (*)(void))sub_4007C0)();
}
sub_4007F0();
}
需要注意的是,x86系列的CPU都是以小端序储存数据的,即低位字节存入低地址,高位字节存入高地址,所以正确的字符串应该反过来,即
脚本
v7 = 'harambe'
v8 = ':\"AL_RT^L*.?+6/46'
flag = ''
for i in range(len(v8)):
c = ord(v7[i % 7]) ^ ord(v8[i])
flag += chr(c)
print(flag)
在main函数中,我们可以看见,当满足一定条件是
我们跟进这个函数
很明显这是我们想要的flag了~~
编写exp
a= [18,64,98,5,2,4,6,3,6,48,49,65,32,12,48,65,31,78,62,32,49,32,1,57,96,3,21,9,4,62,3,5,4,1,2,3,44,65,78,32,16,97,54,16,44,52,32,64,89,45,32,65,15,34,18,16,0]
b=[123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,13,114,1,117,126,0]
flag = ''
for i in range(56):
a[i] = a[i]^b[i]
a[i] = a[i]^19
flag+=chr(a[i])
print(flag)
这儿会自动转换位ascii码来进行异或运算~~
a = 'c61b68366edeb7bdce3c6820314b7498'
flag = ''
for i in range(len(a)):
if i&1:
x=1
else:
x=-1
flag+=chr(ord(a[i])+x)
print(flag)
这道题目我们用IDA打开,查看伪代码
我们知道当我们输入正确的值时,就会输出flag,这个值肯定就会存在某个常量中(因为这道题目不设到算法),但是我们SHIFT+F12确没看见,但是我们将这个exe文件放到记事本中是可以看见flag的,这是因为IDA将数据当作代码处理了
毕竟IDA伪代码不是很准确~~
这个是ELF文件,我们先放进IDA中
F5查看伪代码
我们跟进authenticate()函数
这个应该就是关键函数了
我们可以看见这个函数的地址为08048720,所以我们下断点就可以下在08048725
gdb的命令顺序为
IDA远程调试ELF