原文地址:Msg Me This

题目

Category: Reverse Engineering Points: 500 Solves: 15 Description:

Rick created another vicious program

Could you get the correct flag?

为了方便下载,我把exe文件后缀改成了jpg,下载下来改回去即可。

二进制文件:

解题过程

这个文件是在debug模式下编译的window 32位C++程序,把它拖进IDA Pro里

main函数里,通过使用我在这里IDA Pro - 如何得到比较清楚的逆向伪代码提到的一些技巧,得到以下代码

int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // edx
int v4; // ecx
int v5; // edx
int v6; // ecx
int v7; // edx
int v8; // ST0C_4
LPVOID v10; // [esp+D0h] [ebp-148h]
char v11; // [esp+DCh] [ebp-13Ch]
char v12; // [esp+DDh] [ebp-13Bh]
char v13; // [esp+DEh] [ebp-13Ah]
char v14; // [esp+DFh] [ebp-139h]
int j; // [esp+E8h] [ebp-130h]
unsigned __int8 *i; // [esp+F4h] [ebp-124h]
void (*v17)(); // [esp+100h] [ebp-118h]
int v18; // [esp+10Ch] [ebp-10Ch]
LPVOID lpAddress; // [esp+118h] [ebp-100h]
DWORD flOldProtect; // [esp+124h] [ebp-F4h]
char shellcode[223]; // [esp+130h] [ebp-E8h]
int v22; // [esp+214h] [ebp-4h]
int savedregs; // [esp+218h] [ebp+0h] qmemcpy(shellcode, f_shellcode, sizeof(shellcode));
flOldProtect = 0;
v18 = 222;
v17 = (sub_42AB72 + 1);
for ( i = sub_42AB72 + *(sub_42AB72 + 1); *i == 0xCC; ++i )
;
i += 30;
for ( j = 0; i[j] != 0x90; ++j )
;
lpAddress = sub_42C413(shellcode, v18);
sub_42B112(lpAddress, (j + v18) | -__CFADD__(j, v18));
VirtualProtect(lpAddress, j + v18, 0x40u, &flOldProtect);
sub_42B33D(v4, v3);
sub_42ACEE(lpAddress + j, lpAddress, v18);
v11 = v18;
v12 = 0;
v13 = 0;
v14 = 0;
sub_42ACEE(lpAddress, i, j);
sub_42ACEE(lpAddress + 20, &v11, 4);
v10 = lpAddress;
(lpAddress)();
sub_42B33D(v6, v5);
sub_42C2BF(&savedregs, &dword_43024C, 0, v7);
return sub_42B33D(&savedregs ^ v22, v8);
}

当然我们可以分析并理解这段代码是在干什么,但我们有更简单的方法。

注意这行代码

qmemcpy(shellcode, f_shellcode, sizeof(shellcode));

我们可以先分析f_shellcode

int f_shellcode()
{
int v0; // ebx
_DWORD *v1; // edx
int *v2; // esi
int v3; // ecx
int v4; // eax
_DWORD *v5; // eax
int (__stdcall *v6)(int, int *, signed int, signed int, signed int, _DWORD, _DWORD, int, int (__cdecl *)(_DWORD, _DWORD, _DWORD, _DWORD)); // edx
int (__cdecl *v7)(int, _DWORD *, signed int, signed int); // eax
int v8; // ecx
int v9; // eax
int v10; // eax
int v12; // [esp-Ch] [ebp-20h]
int v13; // [esp-4h] [ebp-18h]
int v14; // [esp+0h] [ebp-14h]
int v15; // [esp+4h] [ebp-10h]
int v16; // [esp+8h] [ebp-Ch]
int v17; // [esp+Ch] [ebp-8h]
int v18; // [esp+10h] [ebp-4h]
int (__cdecl *savedregs)(int, _DWORD *, signed int, signed int); // [esp+14h] [ebp+0h] v0 = *(***(*(__readfsdword(0x30u) + 12) + 20) + 16);
v1 = (v0 + *(v0 + *(v0 + 60) + 120));
v2 = (v0 + v1[8]);
v3 = 0;
do
{
do
{
++v3;
v4 = *v2;
++v2;
v5 = (v0 + v4);
}
while ( *v5 != 0x50746547 );
}
while ( v5[1] != 0x41636F72 || v5[2] != 0x65726464 );
LOWORD(v3) = *(v0 + v1[9] + 2 * v3);
v6 = (v0 + *(v0 + v1[7] + 4 * (v3 - 1)));
v7 = v6(v0, &v13, 0x64616F4C, 0x7262694C, 0x41797261, 0, v6, v0, savedregs);
v8 = savedregs;
savedregs = v7;
v18 = v8;
LOWORD(v8) = 0x6C6C;
v9 = v7(&v15, 0x72657375, 0x642E3233, v8);
v17 = 0;
v16 = 0x41786F;
v10 = savedregs(v9, &v14, 0x7373654D, 0x42656761);
v15 = 0;
return (v10)(0, &v12, &v12, 0, v10 ^ 0x67616C66, v10 ^ 0x6568537B, v10 ^ 0x6F436C6C, v10 ^ 0x7D646564);
}

注意这行

return (v10)(0, &v12, &v12, 0, v10 ^ 0x67616C66, v10 ^ 0x6568537B, v10 ^ 0x6F436C6C, v10 ^ 0x7D646564);

如果我们吧这些十六进制数转换成ASCII就会发现

return (v10)(0, &v12, &v12, 0, v10 ^ 'galf', v10 ^ 'ehS{', v10 ^ 'oCll', v10 ^ '}ded');

galfflag颠倒过来

flag
{She
llCo
ded}

所以flag就是flag{ShellCoded}

OtterCTF - Reverse - Msg Me This的更多相关文章

  1. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  2. EntityFramework Reverse POCO Code First 生成器

    功能强大的(免费)实体框架工具 Julie Lerman 实体框架是开源的,因此开发社区可以在 entityframework.codeplex.com 上共享代码. 但是不要将自己局限在那里寻找工具 ...

  3. SystemCheckError: System check identified some issues: ERRORS: users.Test.groups: (fields.E304) Reverse accessor for 'Test.groups' clashes with reverse accessor for 'User.groups'.

    Error Msg: SystemCheckError: System check identified some issues: ERRORS: users.Test.groups: (fields ...

  4. LeetCode 7. Reverse Integer

    Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 Have you ...

  5. js sort() reverse()

    数组中存在的两个方法:sort()和reverse() 直接用sort(),如下: ,,,,,,,,,,,]; console.log(array.sort());ps:[0, 1, 2, 2, 29 ...

  6. [LeetCode] Reverse Vowels of a String 翻转字符串中的元音字母

    Write a function that takes a string as input and reverse only the vowels of a string. Example 1:Giv ...

  7. [LeetCode] Reverse String 翻转字符串

    Write a function that takes a string as input and returns the string reversed. Example: Given s = &q ...

  8. [LeetCode] Reverse Linked List 倒置链表

    Reverse a singly linked list. click to show more hints. Hint: A linked list can be reversed either i ...

  9. [LeetCode] Reverse Bits 翻转位

    Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...

随机推荐

  1. web框架之初识Django

    目录 一.web框架 1.1什么是web框架 1.2自制的简易web框架 1.3三大主流web框架简介 Django Flask Tornado 1.4动态网页与静态网页 二.初识Django框架 2 ...

  2. [洛谷P4841][集训队作业2013]城市规划

    传送门 题目大意 求出\(n\)个点的简单(无重边无自环)有标号无向连通图数目.\(n\leq 130000\). 题解 题意非常简单,但做起来很难.这是道生成函数经典题,博主当做例题学习用的.博主看 ...

  3. win7连接无线网出现黄色感叹号怎么办?

    用win7连接无线网,出现黄色感叹号: 1.IP冲突,“网络中心”-“无线网属性”,手动改下IP,子网掩码,网关,DNS 2.360断网急救箱修复问题

  4. [CSP-S模拟测试]:棋盘(数学+高精度)

    题目描述 在一个大小为$N\times N$的棋盘上,放置了$N$个黑色的棋子.并且,对于棋盘的每一行和每一列,有且只有一个棋子.现在,你的任务是再往棋盘上放置$N$个白色的棋子.显然,白色棋子不能与 ...

  5. 【Pytest】python单元测试框架pytest简介

    1.Pytest介绍 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高.根据pytest的官方网站介绍 ...

  6. statistic_action

    方差variance 统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数.V 离差平方和(Sum of Squares of Deviations)是各项与平均项之差的平方的 ...

  7. UltraISO 9.6.1.3016(带注册机)

    UltraISO 9.6.1.3016 链接: http://pan.baidu.com/s/1kTqO6hD密码: ehdc

  8. sql查询XML

    --查询Extra里节点UName值等于“黄”的所有信息 select * from t_UserPayLog where Extra.exist('//UName[.="黄"]' ...

  9. 设计模式 - 门面模式(Facade Pattern,也叫外观模式)

    简介 场景 将系统划分为若干个子系统有利于降低系统的复杂性,但是这会增加调用者的复杂性.通过引入 Facade 可以对调用者屏蔽系统内部子系统的细节. Java 中有多个日志库,例如 log4j.lo ...

  10. 04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)

    上一节,我给你讲了 CPU 上下文切换的工作原理.简单回顾一下,CPU 上下文切换是保证 Linux 系统正常工作的一个核心功能,按照不同场景,可以分为进程上下文切换.线程上下文切换和中断上下文切换. ...