题目:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=39

下载得到ElfCrackMe1文件,直接用IDA打开。

最早想到的是 function一路F5下去。可以看到关键的main函数

int __cdecl main(int argc, const char **argv, const char **envp)
{
int v3; // ebx@6
const char **v4; // rdx@22
__int64 v6; // [sp+0h] [bp-C0h]@1
__int64 v7; // [sp+8h] [bp-B8h]@1
__int64 v8; // [sp+10h] [bp-B0h]@1
__int64 v9; // [sp+18h] [bp-A8h]@1
__int64 v10; // [sp+20h] [bp-A0h]@1
__int64 v11; // [sp+28h] [bp-98h]@1
__int64 v12; // [sp+30h] [bp-90h]@1
__int64 v13; // [sp+38h] [bp-88h]@1
int v14; // [sp+40h] [bp-80h]@1
char v15[]; // [sp+80h] [bp-40h]@2
char v16; // [sp+91h] [bp-2Fh]@14
char v17; // [sp+92h] [bp-2Eh]@15
char v18; // [sp+93h] [bp-2Dh]@16
char v19; // [sp+94h] [bp-2Ch]@17
char v20; // [sp+95h] [bp-2Bh]@18
int v21; // [sp+A4h] [bp-1Ch]@1
int v22; // [sp+A8h] [bp-18h]@7
int i; // [sp+ACh] [bp-14h]@9 v21 = ;
memset(&v6, , 0x58uLL);
v6 = 854698492143LL;
v7 = 880468295913LL;
v8 = 597000454391LL;
v9 = 605590388953LL;
v10 = 932007903423LL;
v11 = 760209211613LL;
v12 = 579820585151LL;
v13 = 940597838039LL;
v14 = ;
printf(
"plz enter the flag:",
argv,
11LL,
854698492143LL,
880468295913LL,
597000454391LL,
605590388953LL,
932007903423LL,
760209211613LL,
579820585151LL,
940597838039LL,
*(_QWORD *)&v14);
while ( )
{
v3 = v21;
v15[v3] = getch();
if ( !v15[v3] || v15[v21] == )
break;
if ( v15[v21] == )
{
printf("\b\b", v6, v7, v8, v9, v10, v11, v12, v13, *(_QWORD *)&v14);
--v21;
}
else
{
putchar(v15[v21++]);
}
}
v22 = ;
if ( v21 != )
v22 = ;
for ( i = ; i <= ; ++i )
{
if ( v15[i] != (*((_DWORD *)&v6 + i) - ) / )
{
v22 = ;
argv = (const char **)((*((_DWORD *)&v6 + i) - ) / );
printf("%d", argv, v6, v7, v8, v9, v10, v11, v12, v13, *(_QWORD *)&v14);
}
}
if ( v16 != || v17 != || v18 != || v19 != || v20 != )
v22 = ;
v15[v21] = ;
puts("\r");
if ( v22 )
{
puts("u r wrong\r\n\r");
main((unsigned __int64)"u r wrong\r\n\r", argv, v4);
}
else
{
puts("u r right!\r");
}
return ;
}

看到最下面代码

  

当v22=1时 输出 u r wrong

所以就正确就得使v22为0

我们往上看

当v16 != 48 || v17 != 56 || v18 != 50 || v19 != 51 || v20 != 125时

V22=1

所以就是v16=48 v17=56 v18 = 50 v19=51 v20= 125

V22=0

用python的chr()转化下得到 0 8 2 3 }

可以猜测这个是flag的后半部分

继续往上看发现一串while代码,读起来很吃力。。。所以果断选择放弃,直接去看看汇编代码

观察视图 找到while循环的那一部分

shr指令与sar指令,查了下是逻辑右移和算术右移,在编程里都是<<

但选择用什么是编译器决定的……
所以编程时,最好只对unsigned类型做这种操作……

起初lea=eax,[rcx+rax]这指令没看懂,只知道eax=rcx+rax 。就不知道什么意思,

后来查阅质料才知道因为是64位,所以寄存器变化了

64位寄存器的变化
eax,ebx,ecx,edx,esi,edi,ebp,esp等变为
rax,rbx,rcx,rdx,rsi,rdi,rbp,rsp

所以得出 a[i]=((a2[i]-1)+((a2[i])-1)>>1Fh))>>1

要注意运算优先级,直接要括号就行了。

所以我们要找a2[i]的值,

跳转到a2[i]的定义,看到:

在回代码,往上看到:

所以知道,a2[i]的值是[0x0EF, 0x0C7, 0x0E9, 0x0CD, 0x0F7, 0x8B, 0x0D9,0x8D, 0x0BF, 0x0D9, 0x0DD, 0x0B1, 0x0BF, 0x87,0x0D7, 0x0DB, 0x0BF]

这样就可以直接写python脚本

#!usr/bin/env python
#!coding=utf-8 __author__ = 'zhengjim' a2=[0x0EF, 0x0C7, 0x0E9, 0x0CD, 0x0F7, 0x8B, 0x0D9,
0x8D, 0x0BF, 0x0D9, 0x0DD, 0x0B1, 0x0BF, 0x87,
0x0D7, 0x0DB, 0x0BF]
L=[]
for i in range(17):
flag =((a2[i] - 1) + ((a2[i] - 1) >> 0x1f))>>1
aa = chr(flag)
L.append(aa)
flag1 = ''.join(L)
print flag1

  得到

在与前面的0 8 2 3 }连接 得到:

wctf{ElF_lnX_Ckm_0823}

IDF实验室-简单的ELF逆向 writeup的更多相关文章

  1. 简单的Elf逆向Writeup

    ElfCrackMe1 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acrony ...

  2. IDF实验室-简单编程-字符统计 writeup

    题目地址:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=37 网站:http://ctf.idf.cn/gam ...

  3. IDF-CTF-简单的Elf逆向Writeup

    ElfCrackMe1 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...

  4. IDF实验室-简单编程-特殊的日子 writeup

    题目:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=50 题目提示要爆破,代表加密应该是不可逆的. 密文:4D ...

  5. IDF实验室-简单的js解密

    根据加密方法推算解密方法,补全如下 <script> /** * Pseudo md5 hash function * @param {string} string * @param {s ...

  6. IDF 实验室部分题目WriteUp

    前天花了一个下午的时间刷了几道IDF实验室的题目, 这个网站实在是有点冷清, 题目也比较少, 所以就被我和师兄们刷榜了2333... 因为我最先开始做, 所以就干脆刷到第一去了. 题目很水, 切莫见怪 ...

  7. IDF实验室-CTF训练营-牛刀小试CTF

    自从开始玩CTF后,发现这个游戏还是比较有意思,发现了一个练习场地IDF实验室:http://ctf.idf.cn/ 刷刷里面的题目,今天完成了其中的牛刀小试,分享一下解题思路: 1. 被改错的密码 ...

  8. IDF实验室-python ByteCode writeup

    题目地址:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=45 下载来发现是crackme.pyc 可以用unc ...

  9. elf逆向入门

    一: 在linux下进行调试时容易出现权限不够的情况:此时解决办法就是chmod 777+文件名提升权限,以实验吧debug为例,给出了简单的32elf文件,我在查看一些资料以后发现,我需要在main ...

随机推荐

  1. &&运算符和||运算符的优先级问题

    package priority; public class TestAndOrPriority { /* * &&的优先级高就不代表 他会先运行 ||的右边 而是说会把右边用& ...

  2. IIS会话过期的问题/WCF日志管理

    http://technet.microsoft.com/zh-cn/library/cc725624(v=ws.10).aspx http://msdn.microsoft.com/zh-cn/li ...

  3. redolog 大小的实验

    前言:近日因工作需要,测试postgresql和MySQL在oltp对比测试,因结果差异太多(MySQL测试结果比较差,相同环境),寻求大神帮助,有幸得叶大师和姜大师指点,指出my.cnf配置文件in ...

  4. poj3249

    显然是一道最短路径的题目,但是 1 ≤ n ≤ 100000, 0 ≤ m ≤ 1000000能轻松打爆dij+heap 怎么办? 挖掘题意,这是一个DAG图(有向无环图) 所以对于此类问题,我们有特 ...

  5. 使用Unity3D自带动画系统制作下雨效果

    之前看了以前版本的unity3d demo AngryBots ,觉得里面的下雨效果不错,刚好前段时间学习了,写出来跟大家分享下,直接开始. 使用自带动画系统制作下雨效果. 先制作下雨的雨滴涟漪 步骤 ...

  6. NOI2010能量采集(数论)

    没想到NOI竟然还有这种数学题,看来要好好学数论了…… 网上的题解: 完整的结题报告: 首先我们需要知道一个知识,对于坐标系第一象限任意的整点(即横纵坐标均为整数的点)p(n,m),其与原点o(0,0 ...

  7. php编译参数注解--不明白许多参数的作用 慎用 –with-curlwrappers参数

    在Linux下安装PHP,源代码方式安装,总需要配置很多参数.这里列出常用配置参数,并详细用中文解释说明了.给大家一些参考 编译PHP的时候慎用 –with-curlwrappers参数 ./conf ...

  8. Xcode7下载地址

    XCode 7 7.3.1:https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_7.3. ...

  9. 关于设置sqlplus提示符样式的方法

    摘要:大家在日常工作中,我想99%都会用到sqlplus工具来登陆你的数据库,对数据库进行管理.调优.配置.运维.那么如果有n多台数据库的时候,我们在连接后全部是统一的SQL>提示符,就有可能发 ...

  10. 表格的一些原生js操作(隔行变色,高亮显示,添加删除,搜索)

    看着网上的视频教程,虽说还是有点简单,但还是不免想记录下.这些操作包括(隔行变色,高亮显示,添加删除,搜索功能),而这儿就是涉及table的原有属性“tBodies” “rows” “cells”等几 ...