攻防世界Reverse解题(二)
介绍:记录解题过程
5.Hello, CTF(16进制转ASCII码得到flag)
题目描述:菜鸡发现Flag似乎并不一定是明文比较的
题目场景: 暂无
题目附件: 附件1
- 下载附件1 得到一个exe文件
<1>.查壳
<2>.拖入IDA
- main文件:
int __cdecl main(int argc, const char **argv, const char **envp)
{
int i; // ebx
char v4; // al
int result; // eax
int v6; // [esp+0h] [ebp-70h]
int v7; // [esp+0h] [ebp-70h]
char Buffer[2]; // [esp+12h] [ebp-5Eh] BYREF
char v9[20]; // [esp+14h] [ebp-5Ch] BYREF
char v10[32]; // [esp+28h] [ebp-48h] BYREF
__int16 v11; // [esp+48h] [ebp-28h]
char v12; // [esp+4Ah] [ebp-26h]
char v13[36]; // [esp+4Ch] [ebp-24h] BYREF
strcpy(v13, "437261636b4d654a757374466f7246756e");
while ( 1 )
{
memset(v10, 0, sizeof(v10));
v11 = 0;
v12 = 0;
sub_40134B(aPleaseInputYou, v6);
scanf("%s", v9);
if ( strlen(v9) > 0x11 )
break;
for ( i = 0; i < 17; ++i )
{
v4 = v9[i];
if ( !v4 )
break;
sprintf(Buffer, "%x", v4);
strcat(v10, Buffer);
}
if ( !strcmp(v10, v13) )
sub_40134B(aSuccess, v7);
else
sub_40134B(aWrong, v7);
}
sub_40134B(aWrong, v7);
result = --Stream._cnt;
if ( Stream._cnt < 0 )
return _filbuf(&Stream);
++Stream._ptr;
return result;
}
437261636b4d654a757374466f7246756e
- 将16进制转ASCII码得到flag:
CrackMeJustForFun
6.open-source(修改源码输出flag)
题目描述:菜鸡学逆向学得头皮发麻,终于它拿到了一段源代码
题目场景: 暂无
题目附件: 附件1
- 下载附件1 得到一个c文件
#include <stdio.h>
#include <string.h>
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;
}
- 构造条件(修改源码)输出flag:
- int first = 0xcafe;
- int second = 25;
for i in range(100):
if i % 5 != 3:
if i % 17 == 8:
print("i:", i)
exit()
>>> i: 25
- argv[3] = “h4cky0u”;
strcmp() :C/C++函数,比较两个字符串。
设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数。
- payload:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int first = 0xcafe;
int second = 25;
argv[3] = "h4cky0u";
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;
}
- printf
Brr wrrr grr
Get your key: c0ffee
- flag:
c0ffee
7.simple-unpack(upx -d 脱壳)
题目描述:菜鸡拿到了一个被加壳的二进制文件
题目场景: 暂无
题目附件: 附件1
- 下载附件1 得到一个二进制文件
<2>.有upx壳,使用upx -d
脱壳
C:\Users\XXX\Desktop\display2\IDA>upx -d simple-unpack
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2020
UPX 3.96w Markus Oberhumer, Laszlo Molnar & John Reiser Jan 23rd 2020
File size Ratio Format Name
-------------------- ------ ----------- -----------
912808 <- 352624 38.63% linux/amd64 simple-unpack
Unpacked 1 file.
<3>.扔进IDA64:
- 得到flag:
flag{Upx_1s_n0t_a_d3liv3r_c0mp4ny}
8.logmein
题目描述:菜鸡开始接触一些基本的算法逆向了
题目场景: 暂无
题目附件: 附件1
<1>.ExeinfoPe查壳
<2>.扔进IDA64
void __fastcall __noreturn main(int a1, char **a2, char **a3)
{
size_t v3; // rsi
int i; // [rsp+3Ch] [rbp-54h]
char s[36]; // [rsp+40h] [rbp-50h] BYREF
int v6; // [rsp+64h] [rbp-2Ch]
__int64 v7; // [rsp+68h] [rbp-28h]
char v8[28]; // [rsp+70h] [rbp-20h] BYREF
int v9; // [rsp+8Ch] [rbp-4h]
v9 = 0;
strcpy(v8, ":\"AL_RT^L*.?+6/46");
v7 = 0x65626D61726168LL;
v6 = 7;
printf("Welcome to the RC3 secure password guesser.\n");
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();
for ( i = 0; i < strlen(s); ++i )
{
if ( i >= strlen(v8) )
sub_4007C0();
if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )
sub_4007C0();
}
sub_4007F0();
}
<3>.以下部分来源:攻防世界 Reverse 新手练习区 1-12 全详解
分析
- v7赋值,字符型是v7 = ‘ebmarah’;,需要注意的是,x86系列的CPU都是以小端序储存数据的,即低位字节存入低地址,高位字节存入高地址,所以正确的字符串应该反过来v7=‘harambe’;
- v8赋值v8 = ‘:”AL_RT^L*.?+6/46’
- v6为7
- 输入的flag应该是v7[i%v6]^v8[i]
<4>.payload:
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)
ord()描述:
以一个字符串(Unicode 字符)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值。
例如,ord('a')返回整数97,ord('€')(欧元符号)返回8364。
这与chr()函数相反。
<5>. 得到flag:
RC3-2016-XORISGUD
9.no-strings-attached
题目描述:菜鸡听说有的程序运行就能拿Flag?
题目场景: 暂无
题目附件: 附件1
<1>.ExeinfoPe查壳
<2>.扔进IDA64
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/92699.html