
一个入门级CTF的Reverse
发布日期:2021-05-19 04:41:16
浏览次数:20
分类:博客文章
本文共 7888 字,大约阅读时间需要 26 分钟。
这道题是XCTF攻防世界上的一道新手入门题目!
年前刚接触逆向时IDA,OD了这些工具都不会用(负基础),当时做这些题的时候觉得挺难(主要是缺少练习,没思路无从下手)。现在回头再来看这些题目感觉确实是入门级的题目,所以逆向是门艺术更是门技术,需要多练习熟悉工具和掌握一些技巧,下面就来分析一下这道题目。
题目给了一个附件是一个exe的可执行文件,那好我们先来执行一下他好了!
结果出来一大堆英文,奈何本人英文真的很菜,高考40分:),浑身发憷,不怕手机自带拍照翻译,虽然翻译的水平很一般但是磕磕绊绊的还是能明白他什么意思:这是个游戏(游戏规则:把那几个图形都看成灯,当其都亮时,也就是图形变成实心的游戏胜利),你必须把这个游戏过了之后才会得到我们想要的flag。 我们是要通过工具来获得这个flag,当然如果你玩游戏很nb的话你也可以通关他获得flag。好废话不多说我们现在就来寻找flag!1. 我们先用PEID分析一下程序的基本信息可以看到检测到其未压缩,说明此程序无壳。下面我们可以选择用静态分析工具IDA来分析程序,也可以选用动态调试工具Ollydbg。我们先用IDA来分析吧,因为此程序为32位的所以我们用32位的IDA打开程序。- 我们按Ctrl + E弹出入口函数的信息,点击确定进入入口函数。因为此程序是一个控制台程序,所以我们需要找到main函数(处理逻辑在main函数里)。
进入start函数后我们就可以利用IDA一个强大插件的功能:把反汇编指令转化为C语言式的伪代码,这样我们方便寻找main函数。一般经过IDA的处理后都会显示出main函数的函数名,这种情况我们就可以直接通过寻找main函数名来寻找main函数。但是有的程序在编译时,进行一些设置后IDA无法显示出main函数的函数名,这时我们就不能直接通过查找main函数名来寻找main函数,我们需要通过代码特征进行定位main函数,因为main()结束后会调用exit()函数来退出进程,所以我们只要找到exit函数,那么在其上方的函数就是main函数(也有可能是在这个上方函数的函数才是main函数)。
这个程序我们找到了exit函数,其上方有个invoke_main()函数,那么此函数应该为main函数(或者main函数在其内部),双击此函数进入函数内部。果然main函数在此函数内部,我们在双击进入main函数最里层,查看main函数的逻辑代码。我们对main函数中的逻辑代码进行分析看flag是怎么产生的。往下查看代码发现一处判断,正好像是判断那几盏灯是否都亮的逻辑,当这几盏灯都亮(也就是其值都为1)时,调用Sub_457Ab4( )函数,此函数应该就是flag产生的代码。我们双击进入sub_457AB4()其处理代码为:int sub_45E940(){ signed int i; // [esp+D0h] [ebp-94h] char v2; // [esp+DCh] [ebp-88h] char v3; // [esp+DDh] [ebp-87h] char v4; // [esp+DEh] [ebp-86h] char v5; // [esp+DFh] [ebp-85h] char v6; // [esp+E0h] [ebp-84h] char v7; // [esp+E1h] [ebp-83h] char v8; // [esp+E2h] [ebp-82h] char v9; // [esp+E3h] [ebp-81h] char v10; // [esp+E4h] [ebp-80h] char v11; // [esp+E5h] [ebp-7Fh] char v12; // [esp+E6h] [ebp-7Eh] char v13; // [esp+E7h] [ebp-7Dh] char v14; // [esp+E8h] [ebp-7Ch] char v15; // [esp+E9h] [ebp-7Bh] char v16; // [esp+EAh] [ebp-7Ah] char v17; // [esp+EBh] [ebp-79h] char v18; // [esp+ECh] [ebp-78h] char v19; // [esp+EDh] [ebp-77h] char v20; // [esp+EEh] [ebp-76h] char v21; // [esp+EFh] [ebp-75h] char v22; // [esp+F0h] [ebp-74h] char v23; // [esp+F1h] [ebp-73h] char v24; // [esp+F2h] [ebp-72h] char v25; // [esp+F3h] [ebp-71h] char v26; // [esp+F4h] [ebp-70h] char v27; // [esp+F5h] [ebp-6Fh] char v28; // [esp+F6h] [ebp-6Eh] char v29; // [esp+F7h] [ebp-6Dh] char v30; // [esp+F8h] [ebp-6Ch] char v31; // [esp+F9h] [ebp-6Bh] char v32; // [esp+FAh] [ebp-6Ah] char v33; // [esp+FBh] [ebp-69h] char v34; // [esp+FCh] [ebp-68h] char v35; // [esp+FDh] [ebp-67h] char v36; // [esp+FEh] [ebp-66h] char v37; // [esp+FFh] [ebp-65h] char v38; // [esp+100h] [ebp-64h] char v39; // [esp+101h] [ebp-63h] char v40; // [esp+102h] [ebp-62h] char v41; // [esp+103h] [ebp-61h] char v42; // [esp+104h] [ebp-60h] char v43; // [esp+105h] [ebp-5Fh] char v44; // [esp+106h] [ebp-5Eh] char v45; // [esp+107h] [ebp-5Dh] char v46; // [esp+108h] [ebp-5Ch] char v47; // [esp+109h] [ebp-5Bh] char v48; // [esp+10Ah] [ebp-5Ah] char v49; // [esp+10Bh] [ebp-59h] char v50; // [esp+10Ch] [ebp-58h] char v51; // [esp+10Dh] [ebp-57h] char v52; // [esp+10Eh] [ebp-56h] char v53; // [esp+10Fh] [ebp-55h] char v54; // [esp+110h] [ebp-54h] char v55; // [esp+111h] [ebp-53h] char v56; // [esp+112h] [ebp-52h] char v57; // [esp+113h] [ebp-51h] char v58; // [esp+114h] [ebp-50h] char v59; // [esp+120h] [ebp-44h] char v60; // [esp+121h] [ebp-43h] char v61; // [esp+122h] [ebp-42h] char v62; // [esp+123h] [ebp-41h] char v63; // [esp+124h] [ebp-40h] char v64; // [esp+125h] [ebp-3Fh] char v65; // [esp+126h] [ebp-3Eh] char v66; // [esp+127h] [ebp-3Dh] char v67; // [esp+128h] [ebp-3Ch] char v68; // [esp+129h] [ebp-3Bh] char v69; // [esp+12Ah] [ebp-3Ah] char v70; // [esp+12Bh] [ebp-39h] char v71; // [esp+12Ch] [ebp-38h] char v72; // [esp+12Dh] [ebp-37h] char v73; // [esp+12Eh] [ebp-36h] char v74; // [esp+12Fh] [ebp-35h] char v75; // [esp+130h] [ebp-34h] char v76; // [esp+131h] [ebp-33h] char v77; // [esp+132h] [ebp-32h] char v78; // [esp+133h] [ebp-31h] char v79; // [esp+134h] [ebp-30h] char v80; // [esp+135h] [ebp-2Fh] char v81; // [esp+136h] [ebp-2Eh] char v82; // [esp+137h] [ebp-2Dh] char v83; // [esp+138h] [ebp-2Ch] char v84; // [esp+139h] [ebp-2Bh] char v85; // [esp+13Ah] [ebp-2Ah] char v86; // [esp+13Bh] [ebp-29h] char v87; // [esp+13Ch] [ebp-28h] char v88; // [esp+13Dh] [ebp-27h] char v89; // [esp+13Eh] [ebp-26h] char v90; // [esp+13Fh] [ebp-25h] char v91; // [esp+140h] [ebp-24h] char v92; // [esp+141h] [ebp-23h] char v93; // [esp+142h] [ebp-22h] char v94; // [esp+143h] [ebp-21h] char v95; // [esp+144h] [ebp-20h] char v96; // [esp+145h] [ebp-1Fh] char v97; // [esp+146h] [ebp-1Eh] char v98; // [esp+147h] [ebp-1Dh] char v99; // [esp+148h] [ebp-1Ch] char v100; // [esp+149h] [ebp-1Bh] char v101; // [esp+14Ah] [ebp-1Ah] char v102; // [esp+14Bh] [ebp-19h] char v103; // [esp+14Ch] [ebp-18h] char v104; // [esp+14Dh] [ebp-17h] char v105; // [esp+14Eh] [ebp-16h] char v106; // [esp+14Fh] [ebp-15h] char v107; // [esp+150h] [ebp-14h] char v108; // [esp+151h] [ebp-13h] char v109; // [esp+152h] [ebp-12h] char v110; // [esp+153h] [ebp-11h] char v111; // [esp+154h] [ebp-10h] char v112; // [esp+155h] [ebp-Fh] char v113; // [esp+156h] [ebp-Eh] char v114; // [esp+157h] [ebp-Dh] char v115; // [esp+158h] [ebp-Ch] sub_45A7BE("done!!! the flag is "); v59 = 18; v60 = 64; v61 = 98; v62 = 5; v63 = 2; v64 = 4; v65 = 6; v66 = 3; v67 = 6; v68 = 48; v69 = 49; v70 = 65; v71 = 32; v72 = 12; v73 = 48; v74 = 65; v75 = 31; v76 = 78; v77 = 62; v78 = 32; v79 = 49; v80 = 32; v81 = 1; v82 = 57; v83 = 96; v84 = 3; v85 = 21; v86 = 9; v87 = 4; v88 = 62; v89 = 3; v90 = 5; v91 = 4; v92 = 1; v93 = 2; v94 = 3; v95 = 44; v96 = 65; v97 = 78; v98 = 32; v99 = 16; v100 = 97; v101 = 54; v102 = 16; v103 = 44; v104 = 52; v105 = 32; v106 = 64; v107 = 89; v108 = 45; v109 = 32; v110 = 65; v111 = 15; v112 = 34; v113 = 18; v114 = 16; v115 = 0; v2 = 123; v3 = 32; v4 = 18; v5 = 98; v6 = 119; v7 = 108; v8 = 65; v9 = 41; v10 = 124; v11 = 80; v12 = 125; v13 = 38; v14 = 124; v15 = 111; v16 = 74; v17 = 49; v18 = 83; v19 = 108; v20 = 94; v21 = 108; v22 = 84; v23 = 6; v24 = 96; v25 = 83; v26 = 44; v27 = 121; v28 = 104; v29 = 110; v30 = 32; v31 = 95; v32 = 117; v33 = 101; v34 = 99; v35 = 123; v36 = 127; v37 = 119; v38 = 96; v39 = 48; v40 = 107; v41 = 71; v42 = 92; v43 = 29; v44 = 81; v45 = 107; v46 = 90; v47 = 85; v48 = 64; v49 = 12; v50 = 43; v51 = 76; v52 = 86; v53 = 13; v54 = 114; v55 = 1; v56 = 117; v57 = 126; v58 = 0; for ( i = 0; i < 56; ++i ) { *(&v2 + i) ^= *(&v59 + i); *(&v2 + i) ^= 0x13u; } return sub_45A7BE("%s\n");}
其是将V2 - V57与 V59 - V114的字符分别异或之后再与0x13u异或后,得到的字符串就为flag
注意此代码不能直接复制粘贴到进行使用,因为其默认V2 - V115的变量是连续存储的(即地址是连续的),而实际其会因为字节对齐而不连续存储,所以要自己写代码的到flag。下面是我用c++写的代码(python语法都忘光了!)。#includeusing namespace std;int main(){char a[] = {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, 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 }; cout<<"done!!! the flag is: "; for (int i = 0; i < 56; ++i ) { a[i] = a[i] ^ a[i+57]; a[i] = a[i] ^ 0x13u; cout<
flag为zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
下面我们用Ollydbg来分析这道题:打开OD运行这个程序,其会停在入口处,然后我们点击鼠标右键-》中文搜索引擎-》智能搜索。会弹出所有字符串的信息!我们会发现this is a flag:字符串(说明字符串是在此处产生的),我们双击此字符串进入此代码块。进入代码块后我们往下查看代码,我们发现%s/n字符串作为参数传给一个函数,所以此函数应该为printf函数,eax为显示字符串的指针。(此字符串就是flag)上方代码应为flag的处理代码。我们要获得flag就必须执行这块代码,所以我们在其flag的处理代码块的第一条指令处右击鼠标-》点击设置为新eip,在printf函数的入口参数处下断点,然后运行程序。当程序到达断点处是会停止运行,因为断点处为printf函数处,而eax为所显示flag字符串的指针所以我们在OD右上角的寄存器窗口中可以看到flag。发表评论
最新留言
很好
[***.229.124.182]2025年04月30日 18时40分02秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
自定义Seekbar样式
2019-03-17
Hidden treasures of the Rust ecosystem
2019-03-17
【Rust投稿】从零实现消息中间件(6)-CLIENT
2019-03-17
Rust异步浅谈
2019-03-17
【Rust每周一库】sled - 嵌入式数据库
2019-03-17
【Rust日报】2020-08-01 用 Rust 重写的一系列命令行工具
2019-03-17
【Rust 日报】2020-12-05 rust-gpu 发布 v0.2
2019-03-17
man工具
2019-03-17
FoxMail 查看邮件乱码
2019-03-17
【网络加速】TensorRT7-开发指南中文_Plus版【1】
2019-03-17
SaltStack about The Top File 使用知识介绍
2019-03-17
SaltStack的多云管理解决方案——使用Salt Cloud集成管理腾讯云平台
2019-03-17
网络协议和支持(一)、uuid模块
2019-03-17
numpy.vstack
2019-03-17
numpy.frombuffer()
2019-03-17
文件结束符EOF
2019-03-17