Reversing.kr Position分析题解

先看下程序界面和要求:

76876-77776是固定的数值,要求在空白处输入相应的

字符。要求字符数4个,且最后一个为p。答案不唯一。

1,首先我们查下壳,没有加壳,c++写的程序.

2,使用IDA查看下,

很多这样的函数,让人没有头绪。

3,再使用OD查看下,地址并不是常见的。我们查看下是否有反调试之类的函数。

最常见的函数isdebugerPresen.按下ctrl+N,输入函数

还真有这个函数,使用d fs:[30]+2  使0修改为1,然而并没有什么用。

4,寻找到获取输入的位置,常见的函数getdlgitemtextA(w),同样没有找到。

仔细在程序中找一张,发现了这段代码。这以下的好像是关键的判断部分。在IDA中看下它的流程框图。

5,对代码进行分析。

首先对输入的长度进行了判断,长度为4,不符合即结束。

对输入的字符进行判断,要在a--z之间,且4个字符中不能有一样的。

接下来就进入到了数据处理部分。仔细观察下面的程序,主要是对AL,BL,CL,DL进行操作,将其放入相应的推栈位置中取出比较。

不难发现在这段程序中有10个跳转,相对应的7 6 8 7 6 7 7 7 7 6这10个数据,每个跳转对应一次比较。

。。。

比较的值又是什么呢,来看一下。这里以第一次和第二次为例。

看cmp ax,di ,不用想di的值就是7(给定序列中的第一个,因为第一次比较),重点就是ax的值哪里来的。call函数的大概作用就是把ecx的值赋给ax。ecx的值就要看add  ecx,edx 指令了。ecx来自bl,而edx来自ebp--0x20.而这所有的赋值都要往上看,

这里不再具体分析指令的意义。

判断的依据就是从堆栈中取出相应的数据复制给相应的寄存器,寄存器相加赋值给ax,ax再和di(给定序列中的值)

比较。其实这只是前部分,前部分是两个字符,后部分也是两个字符,对字符的处理也是一样。每部分对数据都会有一次处理。具体可以查看程序分析。下面给出相应的对应关系。

前部分:

这里输入的数据用数组表示a[4];a[0]表示第一个数据。

堆栈            地址             所对应的数据用堆栈的偏移表示

ebp-0x20       e580                     20(偏移量)

ebp-0x1d       e583                     1d

ebp-0x25       e578                     25

ebp-0x24       e57c                     24

ebp-0x1f        e581                     1f

ebp-0x1e       e582                     1e

ebp-0x28       e590                     28

ebp-0x1c       e584                    1c

ebp-0x27       e579                     27

和序列对应关系

20(上面的偏移量)+bl(最先开始的一次判断,没有使用堆栈,分析程序可以得出)=7

1d+25=6

24+1f=8

28+1e=7

1c+27=6

每个寄存器中值运算来源

20  (偏移量)(ebp-0x20)= (a[0] and 1)+5

1c=a[0]>>4 and 1+5

1f=a[0]>>1and 1+5

1e=a[0]>>2and 1+5

1d=a[0]>>3and 1+5

28=a[1]and 1+1

24=a[1]>>4and 1+1

27=a[1]>>1and 1+1

25=a[1]>>3and 1+1

bl=a[1]>>2and 1+1

以上是第一部分的信息,有不懂的需要分析程序。

下面是第二部分的信息。

这里输入的数据用数组表示a[4];a[0]表示第一个数据。

堆栈            地址             所对应的数据用堆栈的偏移表示

ebp-0x20       e580                     20(偏移量)

ebp-0x1d       e583                     1d

ebp-0x25       e578                     25

ebp-0x24       e57c                     24

ebp-0x1f        e581                     1f

ebp-0x1e       e582                     1e

ebp-0x28       e590                     28

ebp-0x1c       e584                    1c

ebp-0x27       e579                     27

和序列对应关系

20(上面的偏移量)+bl(最先开始的一次判断,没有使用堆栈,分析程序可以得出)=7

1d+25=7

24+1f=7

28+1e=7

1c+27=6

每个寄存器中值得来源

20  (偏移量)(ebp-0x20)= (a[2] and 1)+5

1c=a[2]>>4 and 1+5

1f=a[2]>>1and 1+5

1e=a[2]>>2and 1+5

1d=a[2]>>3and 1+5

28=a[3]and 1+1

24=a[3]>>4and 1+1

27=a[3]>>1and 1+1

25=a[3]>>3and 1+1

bl=a[3]>>2and 1+1

对于以上代码我们写一个python小脚本

代码如下:

ch=[]

for a in range(97,123):

ch.append(a)

print ch

for i in ch:

for j in ch:

if(((i&1)+5)+((j>>2&1)+1)==7)and(((i>>3&1)+5)+((j>>3&1)+1)==6)and(((j>>4&1)+1)+((i>>1&1)+5)==8)and(((j&1)+1)+((i>>2&1)+5)==7)and(((i>>4&1)+5)+((j>>1&1)+1)==6):

print chr(i),chr(j)

print"-------"

for i in ch:

j=112

if(((i&1)+5)+((j>>2&1)+1)==7)and(((i>>3&1)+5)+((j>>3&1)+1)==7)and(((j>>4&1)+1)+((i>>1&1)+5)==7)and(((j&1)+1)+((i>>2&1)+5)==7)and(((i>>4&1)+5)+((j>>1&1)+1)==6):

print chr(i),chr(j)

结果如下:

答案分别为:

bump

cqmp

ftmp

gpmp(不符合要求,因为程序中规定了不允许有重复的字符出现)

来自为知笔记(Wiz)

时间: 2024-08-10 01:32:49

Reversing.kr Position分析题解的相关文章

reversing.kr学习之路-ransomeware

ransomeware - writeup 题目来源 http://reversing.kr 题目知识点:upx + 花指令 + 堆栈不平衡 + exe特征码提取key 前言 文章只是记录一下自己在reversing.kr上学习CTF逆向的经历,如果文中出现什么技术错误,烦请各位大佬,在评论中指正.本人技术刚刚入门,菜鸟一枚,大佬勿喷啊- 正文 首先在网站上下载附件,得到一个zip,里面包含了一个txt.一个exe和一个file.根据txt里面的提示,可以得到exe为加密程序,file为加密后的

Reversing.Kr writeup

Reserving.Kr writeupEasy CrackEasy KeygenReplaceEasy_ELF Reversing.Kr writeup 这个网站http://reversing.kr 学习逆向很不错.各个平台的逆向都有,最近在慢慢的刷这些题 Easy Crack 看名字就知道很简单,PEID查壳,拖入OD,找到关键代码 0040109B|.8B7C2470 mov edi,dword ptr ss:[esp+0x70];|user32.76D1D2B3 0040109F|.8

洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码

洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要使用它需要一定的费用.m条单向通道连接相邻的两对情侣所在电影院.然后HXY有个绝技,如果她能从一个点开始烧,最后回到这个点,那么烧这条回路上的情侣的费用只需要该点的汽油费即可.并且每对情侣只需烧一遍,电影院可以重复去.然后她想花尽

洛谷P2832 行路难 分析+题解代码【玄学最短路】

洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座山,只能单向通过,并会耗费小X一定时间. 小X现在在1号山,他的目的是n号山,因为那里有火车站. 然而小X的体力是有限的.他每通过一条羊肠小道,就会变得更疲劳,导致他通过任意一条羊肠小道的时间都增加1. 输入格式: 第一行两个数,n,m 第2行到第m+1行,每行3个数A,B,C,表示A.B之间有一条

reversing.kr replace 之write up

好似reversing除了前几个容易些,后面的都很难的.看wp都很困难.首先wp提示crtl+n查看程序所有函数,并且找到了测试函数: 然而宝宝我换了n多个od都没有得到和作者同样的结果: 后来运行程序后再用ctrl+n神奇的出现了: 那我们就按照wp一步一步来:跟进目标函数,我们发现了如下目标函数: f8一直向下执行: 我们发现程序走到这里就执行不下去了,这次我们输入0,观察此时对应的EAX=0x611605cb,于是我们分析得到由于我们输入错误所以eax到了错误的地址,所以eax=输入+0x

reversing.kr easy crack 之write up

之前学逆向感觉学得一踏糊涂,这阶段好多师傅带我,一定要好好学,重新开始,认真学习. 来看打开可执行文件: 用ollydbg载入,单步执行后停到了入口点: 分析入口点,并没有加壳,于是F9执行程序,跳出了程序执行框,随便输入些字符,出现了错误框的提示: F12暂停程序后Alt+k查看调用栈: 补充: MessageBox指的是显示一个模态对话框,其中包含一个系统图标. 一组按钮和一个简短的特定于应用程序消息,如状态或错误的信息.消息框中返回一个整数值,该值指示用户单击了哪个按钮. 在图中高亮处点击

[Reversing.kr] Easy_KeygenMe Writeup

IDA打开.Main()函数就是关键算法 v6,v7,v8 是连续的 .可看成 L=[16,32,48].输入的name每位分别于L[]异或 得到的值存在v13.然后清空v9的值 ,输入Serial储存在v9  再让v13与v9比较. 可还原算法: #!usr/bin/env python #!coding=utf-8 __author__ = 'zhengjim' name = raw_input() L=[16,32,48] flag ='' for i,name in enumerate(

2019.7.24 校内测试 分析+题解

T1 地雷 题目很简单呢,就是求哪个数只出现了一次就可以了哦~ 我一开始的想法是桶排(这也是最单纯最简单的想法吧~),但是空间开 232 肯定会炸的,而且时间好像也会炸掉. 然后左边的 ych 大佬小声说了一句:“得换个算法.” 嗯,确实要换个算法,然后我就觉得新算法一定是不用开数组,直接输完数据就能出答案的那种! 然后不知道怎么就想到了 zhx 讲博弈论的时候输入的同时将 ……(一些稀奇古怪的东西) 异或起来就是答案,这不正好跟我理想的新算法很像嘛? 异或异或?咦,又想到了六月底那次考试有个叫

诚意干货:如何神不知鬼不觉破解你家路由器 | 硬创公开课

你见过"僵尸"来袭吗? 你自己也成为其中一个"僵尸"会是怎样的感受? 这次,可能要玩得更酷炫一点! 如果你家路由器被破解,那么就可能是5万僵尸网络中的一员! 带来此次讲座的是一个"别人家的小孩",他目前还在读大三,却已经是长亭科技核心安全团队中的一员.2016年,他和团队在黑客盛会GeekPwn上破解了11款路由器,获得冠军,并拿下42万元奖金. 为什么要聊这个话题? 路由器是互联网络的枢纽--"交通警察".目前路由器已经广泛