测试文件:https://adworld.xctf.org.cn/media/task/attachments/3f35642056324371b913687e770e97e6.exe

1.准备

打开测试文件,flag内容为乱码。

检测文件信息

获得信息

  1. 32位文件
  2. OllyDbg打开

2.IDA打开

将main函数反编译为C语言文件后,得到

 int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
int v3; // ecx
CHAR *lpMem; // [esp+8h] [ebp-Ch]
HANDLE hHeap; // [esp+10h] [ebp-4h] hHeap = HeapCreate(0x40000u, , );
lpMem = (CHAR *)HeapAlloc(hHeap, 8u, MaxCount + );
memcpy_s(lpMem, MaxCount, &unk_409B10, MaxCount);
if ( sub_40102A() || IsDebuggerPresent() )
{
__debugbreak();
sub_401000(v3 + , lpMem);
ExitProcess(0xFFFFFFFF);
}
MessageBoxA(, lpMem + , "Flag", 2u);
HeapFree(hHeap, , lpMem);
HeapDestroy(hHeap);
ExitProcess();
}

2.1 代码分析

1.看到第16行代码,输出flag,lpMem中保存着flag值。

2.第8行代码,为lpMen申请内存空间。

3.第9行代码,为lpMem赋值。其中&unk_409B10的值为

.data:00409B10 unk_409B10      db 0BBh                 ; DATA XREF: _main+33↑o
.data:00409B11 db 0CCh
.data:00409B12 db 0A0h
.data:00409B13 db 0BCh
.data:00409B14 db 0DCh
.data:00409B15 db 0D1h
.data:00409B16 db 0BEh
.data:00409B17 db 0B8h
.data:00409B18 db 0CDh
.data:00409B19 db 0CFh
.data:00409B1A db 0BEh
.data:00409B1B db 0AEh
.data:00409B1C db 0D2h
.data:00409B1D db 0C4h
.data:00409B1E db 0ABh
.data:00409B1F db 82h
.data:00409B20 db 0D2h
.data:00409B21 db 0D9h
.data:00409B22 db 93h
.data:00409B23 db 0B3h
.data:00409B24 db 0D4h
.data:00409B25 db 0DEh
.data:00409B26 db 93h
.data:00409B27 db 0A9h
.data:00409B28 db 0D3h
.data:00409B29 db 0CBh
.data:00409B2A db 0B8h
.data:00409B2B db 82h
.data:00409B2C db 0D3h
.data:00409B2D db 0CBh
.data:00409B2E db 0BEh
.data:00409B2F db 0B9h
.data:00409B30 db 9Ah
.data:00409B31 db 0D7h
.data:00409B32 db 0CCh
.data:00409B33 db 0DDh

4. 从第13行代码我们知道,第10~15行代码在对lpMem操作,又因为 ExitProcess(0xFFFFFFFF);所以猜测,这段if结构没有执行(执行的话,就会直接退出,不会有跳出MessageBox对话框)

3.OllyDbg打开

 > $  E8 531A0000   call 00112D5F
0011130C .^ E9 95FEFFFF jmp 001111A6
> 8BFF mov edi,edi
/. push ebp
|. 8BEC mov ebp,esp
|. 81EC sub esp,0x328
0011131C |. A3 589C1100 mov dword ptr ds:[0x119C58],eax
|. 890D 549C1100 mov dword ptr ds:[0x119C54],ecx
|. 509C1100 mov dword ptr ds:[0x119C50],edx
0011132D |. 891D 4C9C1100 mov dword ptr ds:[0x119C4C],ebx
|. 489C1100 mov dword ptr ds:[0x119C48],esi
|. 893D 449C1100 mov dword ptr ds:[0x119C44],edi
0011133F |. :8C15 709C1>mov word ptr ds:[0x119C70],ss
|. :8C0D 649C1>mov word ptr ds:[0x119C64],cs
0011134D |. :8C1D 409C1>mov word ptr ds:[0x119C40],ds
|. :8C05 3C9C1>mov word ptr ds:[0x119C3C],es
0011135B |. :8C25 389C1>mov word ptr ds:[0x119C38],fs
|. :8C2D 349C1>mov word ptr ds:[0x119C34],gs
|. 9C pushfd
0011136A |. 8F05 689C1100 pop dword ptr ds:[0x119C68]
|. 8B45 mov eax,dword ptr ss:[ebp]
|. A3 5C9C1100 mov dword ptr ds:[0x119C5C],eax
|. 8B45 mov eax,dword ptr ss:[ebp+0x4]
0011137B |. A3 609C1100 mov dword ptr ds:[0x119C60],eax
|. 8D45 lea eax,[arg.]
|. A3 6C9C1100 mov dword ptr ds:[0x119C6C],eax
|. 8B85 E0FCFFFF mov eax,[local.]
0011138E |. C705 A89B1100>mov dword ptr ds:[0x119BA8],0x10001
|. A1 609C1100 mov eax,dword ptr ds:[0x119C60]
0011139D |. A3 5C9B1100 mov dword ptr ds:[0x119B5C],eax
001113A2 |. C705 509B1100>mov dword ptr ds:[0x119B50],0xC0000409
001113AC |. C705 549B1100>mov dword ptr ds:[0x119B54],0x1
001113B6 |. A1 mov eax,dword ptr ds:[0x119004]
001113BB |. D8FCFFFF mov [local.],eax
001113C1 |. A1 mov eax,dword ptr ds:[0x119008]
001113C6 |. DCFCFFFF mov [local.],eax
001113CC |. FF15 call dword ptr ds:[<&KERNEL32.IsDebugger>; [IsDebuggerPresent
001113D2 |. A3 A09B1100 mov dword ptr ds:[0x119BA0],eax
001113D7 |. 6A push 0x1
001113D9 |. E8 1C1A0000 call 00112DFA
001113DE |. pop ecx
001113DF |. 6A push 0x0 ; /pTopLevelFilter = NULL
001113E1 |. FF15 call dword ptr ds:[<&KERNEL32.SetUnhandl>; \SetUnhandledExceptionFilter
001113E7 |. 3C611100 push 0011613C ; /pExceptionInfo = pro3.0011613C
001113EC |. FF15 call dword ptr ds:[<&KERNEL32.UnhandledE>; \UnhandledExceptionFilter
001113F2 |. 833D A09B1100>cmp dword ptr ds:[0x119BA0],0x0
001113F9 |. jnz X00111403
001113FB |. 6A push 0x1
001113FD |. E8 F8190000 call 00112DFA
|. pop ecx
|> 090400C0 push 0xC0000409 ; /ExitCode = C0000409 (-1073740791.)
|. FF15 2C601100 call dword ptr ds:[<&KERNEL32.GetCurrent>; |[GetCurrentProcess
0011140E |. push eax ; |hProcess
0011140F |. FF15 call dword ptr ds:[<&KERNEL32.TerminateP>; \TerminateProcess
|. C9 leave
\. C3 retn

右键查找全部字符串,找到“Flag”的位置

001110A5   .  6A          push 0x2                                 ; /Style = MB_ABORTRETRYIGNORE|MB_APPLMODAL
001110A7 . push ; |Title = "Flag"
001110AC . FF75 F4 push dword ptr ss:[ebp-0xC] ; |Text
001110AF . 6A push 0x0 ; |hOwner = NULL
001110B1 . FF15 E4601100 call dword ptr ds:[<&USER32.MessageBoxA>>; \MessageBoxA
001110B7 . EB jmp X001110CD
001110B9 > 6A push 0x2 ; /Style = MB_ABORTRETRYIGNORE|MB_APPLMODAL
001110BB . push ; |Title = "Flag"
001110C0 . 8B45 F4 mov eax,dword ptr ss:[ebp-0xC] ; |
001110C3 . inc eax ; |
001110C4 . push eax ; |Text
001110C5 . 6A push 0x0 ; |hOwner = NULL
001110C7 . FF15 E4601100 call dword ptr ds:[<&USER32.MessageBoxA>>; \MessageBoxA

通过设置断点调试,我们可以了解到,if结构和第1个“Flag”处没有执行。

if结构对应汇编代码:

   .  E8 A2FFFFFF   call 0011102A
. 85C0 test eax,eax
0011108A . 0A jnz X00111096
0011108C . FF15 call dword ptr ds:[<&KERNEL32.IsDebugger>; [IsDebuggerPresent
. 85C0 test eax,eax
je X001110B9
> inc ecx
. inc ecx
. inc ecx
. inc ecx
0011109A . CC int3
0011109B . 8B55 F4 mov edx,dword ptr ss:[ebp-0xC]
0011109E . E8 5DFFFFFF call
001110A3 . EB 4A jmp X001110EF

3.1 代码分析

既然这个if结构中有对flag值的操作,而且还跳过了,秉承“偷鸡摸狗,必定有内幕”的侦探心理,在OD修改代码,使得程序执行if结构,再跳转到第二个MessageBox处。

3.2 代码修改

   .  E8 A2FFFFFF   call 0011102A
. 85C0 test eax,eax
0011108A . 0A jnz X00111096
0011108C . FF15 call dword ptr ds:[<&KERNEL32.IsDebugger>; [IsDebuggerPresent
. 85C0 test eax,eax
nop
nop
> inc ecx
. inc ecx
. inc ecx
. inc ecx
0011109A nop
0011109B . 8B55 F4 mov edx,dword ptr ss:[ebp-0xC]
0011109E . E8 5DFFFFFF call
001110A3 EB jmp X001110B9

3.3 运行获取flag

设置断点,之后调试。

4. get flag!

flag{reversing_is_not_that_hard!}

攻防世界--csaw2013reversing2的更多相关文章

  1. 逆向-攻防世界-CSAW2013Reversing2

    运行程序乱码,OD载入搜索字符串,断电到弹窗Flag附近. 发现跳过00B61000函数,弹窗乱码,我们试试调用00B61000函数.将00B61094的指令修改为JE SHORT 00B6109b. ...

  2. 攻防世界 csaw2013reversing2 CSAW CTF 2014

    运行程序 flag显示乱码 IDA打开查看程序逻辑 1 int __cdecl __noreturn main(int argc, const char **argv, const char **en ...

  3. CTF--web 攻防世界web题 robots backup

    攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...

  4. CTF--web 攻防世界web题 get_post

    攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...

  5. 攻防世界 web进阶练习 NewsCenter

    攻防世界 web进阶练习 NewsCenter   题目是NewsCenter,没有提示信息.打开题目,有一处搜索框,搜索新闻.考虑xss或sql注入,随便输入一个abc,没有任何搜索结果,页面也没有 ...

  6. 【攻防世界】高手进阶 pwn200 WP

    题目链接 PWN200 题目和JarvisOJ level4很像 检查保护 利用checksec --file pwn200可以看到开启了NX防护 静态反编译结构 Main函数反编译结果如下 int ...

  7. XCTF攻防世界Web之WriteUp

    XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...

  8. 攻防世界 | CAT

    来自攻防世界官方WP | darkless师傅版本 题目描述 抓住那只猫 思路 打开页面,有个输入框输入域名,输入baidu.com进行测试 发现无任何回显,输入127.0.0.1进行测试. 发现已经 ...

  9. 攻防世界 robots题

    来自攻防世界 robots [原理] robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在, ...

随机推荐

  1. maven_上传到私服,以及从私服下载

    公司由于没有maven,自己又想用,于是乎,就自己搭了一个nexus 1.苦逼不多说,将本地jar文件上传到maven 需要在本机(客户端windows)中的maven中的setting.xml添加这 ...

  2. linux--基础知识4

    #当前已什么用户登陆,创建的目录或文件,他的属组和主就是谁 #用户对目录拥有的几种权限 # ll -d查看目录当前权限信息 #r:可以查看该目录下的子文件名,子目录 #w:可以在该目录下创建,删除,重 ...

  3. HTTP RESTful服务开发 spring boot+Maven +Swagger

    这周配合第三方平台整合系统,需要提供HTTP REST服务和使用ActiveMQ推送消息,研究了下,做个笔记. 1.使用eclipse创建Spring Boot项目  创建Spring Boot项目( ...

  4. HTML5 Canvas(实战:绘制饼图2 Tooltip)

    继上一篇HTML5 Canvas(实战:绘制饼图)之后,笔者研究了一下如何给饼图加鼠标停留时显示的提示框. Plot对象 在开始Coding之前,笔者能够想到的最easy的方式,就是给饼图的每一个区域 ...

  5. Mac新手入门:mac操作技巧

    面对全新的mac电脑,你是不是一脸的迷茫,一些原来windows上的基本操作在mac上都不知道从何入手了,下面小编就为大家整理了一些基本的操作.相信一定会方便你的学习和工作的. 如何压缩与解压缩 在M ...

  6. linux运维、架构之路-linux文件权限

    一. R W X对应的数字及计算的方法 1.linux普通文件权限总结 ①r可读:表示具有读取.浏览文件内容(block)的权限 ②w可写:表示具有新增.修改文件内容的权限删除文件(修改文件名.)或创 ...

  7. [CF959A]Mahmoud and Ehab and the even-odd game题解

    题意简述 一个数n,Mahmoud珂以取(即如果取\(k\),使\(n = n - k\))一个正偶数,Ehab珂以取一个正奇数,一个人如果不能取了(对于Mahmoud和Ehab \(n = 0\), ...

  8. 【HDOJ6685】Rikka with Coin(DP)

    题意:有10,20,30,100四种硬币,每种数量无限,给定n个a[i],问能组成所有a[i]的硬币的最小总数量 n<=1e2,a[i]<=1e9 思路: #include<bits ...

  9. 史上最全最实用HBuilder快捷键大全

    史上最全最实用HBuilder快捷键大全 一.文件操作二.编辑操作三.插入操作四.转义操作五.选择操作六.跳转操作七.查找操作八.运行九.视图一.文件操作新建菜单: ctrl + N新建: ctrl ...

  10. (最小割)Path

    http://acm.hdu.edu.cn/showproblem.php?pid=6582 思路:找到最短路核心边建图,跑一遍最小割,最短路核心边的定义为设起点到每个点的最短距离为d[i],每个点到 ...