【CTF】ASM-Pico CTF 2014 Snippet

【Title】Pico CTF 2014 Write-up snippet

【Description】

We found this program snippet.txt, but we‘re having some trouble figuring it out. What‘s the value of %eax when the last instruction (the NOP) runs?

Hint:
You may want to convert the assembly into some equivalent C code, which will be easier to read!

?

# This file is in AT&T syntax - see http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm

# and http://en.wikipedia.org/wiki/X86_assembly_language#Syntax. Both gdb and objdump produce

# AT&T syntax by default.

MOV $10814,%ebx

MOV $2972,%eax

MOV $10017,%ecx

CMP %eax,%ebx

JL L1

JMP L2

L1:

IMUL %eax,%ebx

ADD %eax,%ebx

MOV %ebx,%eax

SUB %ecx,%eax

JMP L3

L2:

IMUL %eax,%ebx

SUB %eax,%ebx

MOV %ebx,%eax

ADD %ecx,%eax

L3:

NOP

?

【Solution】

Let‘s walk through the program step-by-step. The first actions that occur is that 15329 is moved into %ebx (%ebx = 15329), 21674 is moved into %eax, and 25704 is moved into %ecx. The next operation is a CMP operation, where in AT&T syntax, the operation checks if the second element is less than the first element. If this is true it follows the first jump statement, and if it is false, it jumps to the second jump statement. In this case %ebx is less than %eax (15329 < 21674), so the program follows the path into the L1 function. The next thing that occurs is that %eax and %ebx are multiplied, and the value is stored into %ebx. At the end of this %ebx = 332240746. %eax is then added to %ebx and stored in %ebx, making %ebx = 332262420. The value of %ebx is then moved into %eax, making %eax = 332262420. Next %ecx is subtracted from %eax and stored into %eax, which makes %eax = 332236716. A jump to the L3 function is then called, which calls NOP and ends the program. The flag is the value of %eax at the end of the program which is 332236716.

【Appendix】

There‘s another solution from vulnhub:

Just save the code in basic.s with a few small changes:

?

.global main

.text

?

main:

?

MOV $119,%ebx

MOV $28557,%eax

MOV $8055,%ecx

CMP %eax,%ebx

JL L1

JMP L2

L1:

IMUL %eax,%ebx

ADD %eax,%ebx

MOV %ebx,%eax

SUB %ecx,%eax

JMP L3

L2:

IMUL %eax,%ebx

SUB %eax,%ebx

MOV %ebx,%eax

ADD %ecx,%eax

L3:

INT3 # <--- set a breakpoint here

NOP

?

?

And compile it with gcc: gcc –basic basic.s

Run in gdb and get the value of EAX:

gdb ./basic -q -batch -n -ex ‘r‘ -ex ‘p $eax‘

?

最近有很多英语的活要做,所以文章也就倾向于用英文写了,这样提升更快^_^。

顺便补习一下gcc的知识吧(cv自网络):

下面我们以C语言为例来谈一下不同阶段的输入和输出情况。

在预处理阶段,输入的是C语言的源文件,通常为*.c。它们通常带有.h之类头文件的包含文件。这个阶段主要处理源文件中的#ifdef、 #include和#define命令。该阶段会生成一个中间文件*.i,但实际工作中通常不用专门生成这种文件,因为基本上用不到;若非要生成这种文件不可,可以利用下面的命令:

gcc -E test.c -o test.i

在编译阶段,输入的是中间文件*.i,编译后生成汇编语言文件*.s 。这个阶段对应的GCC命令如下所示:

GCC -S test.i -o test.s

在汇编阶段,将输入的汇编文件*.s转换成机器语言*.o。这个阶段对应的GCC命令如下所示:GCC -c test.s -o test.o

最后,在连接阶段将输入的机器代码文件*.s(与其它的机器代码文件和库文件)汇集成一个可执行的二进制代码文件。这一步骤,可以利用下面的示例命令完成:

GCC test.o -o test

上面的gdb命令看懂了吗?一开始我是没看懂的:-D如果要是我估计只会拿p eax试一下了,还是要多多学习~

?

?

【Reference】

https://ctf-team.vulnhub.com/picoctf-2014-basic-asm/

http://en.wikipedia.org/wiki/X86_assembly_language#Syntax

http://ehsandev.com/pico2014/reverse_engineering/basic_asm.html

https://github.com/ctfs/write-ups-2014/blob/master/pico-ctf-2014/reverse-engineering/basic-asm-60/snippet.txt

时间: 2024-12-28 13:33:12

【CTF】ASM-Pico CTF 2014 Snippet的相关文章

【原】新装SQL Server 2014 遇到问题的解决方法。

[尝试读取或写入受保护的内存.这通常指示其他内存已损坏. (System.Data)] 管理员身份运行 cmd -> 输入 netsh winsock reset 提问者评价 曾经让我重装系统的bug,一句话就就解决了,谢谢你~ 评论 | 2 [原]新装SQL Server 2014 遇到问题的解决方法.

【CTF】RE Backdoor CTF 2015 TEAM 600

来源: Backdoor CTF 2015 There is a wierd kind of authentication service running: nc hack.bckdr.in 8004. The binary can be found here. The vampire says that there is no need for bruteforce. ? 解题思路: 看一下文件格式 不管那么多,先扔到IDA里面看看 随便选择一个函数,按X(虽然好笨的方法但是很实用?注意光标位

【pwnable】asm之write up

首先查看源代码: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/mman.h> #include <seccomp.h> #include <sys/prctl.h> #include <fcntl.h> #include <unistd.h> #define LENGTH 128 void sandbox(){

【Azure】ASM虚拟机迁移到ARM中

这两天开始讲之前在老门户(ASM)中的虚拟机往新门户(ARM)中进行迁移,阅读了很多博主的文章和微软云网站的介绍,在下使用微软云官网介绍的迁移工具进行迁移. 在开始迁移体验之前,了解一下整个迁移的流程,总共分四步: 验证:是在后台对进行迁移的资源执行数据分析,并在资源能够进行迁移时返回成功/失败 准备:是要模拟将 IaaS 资源从经典资源转换为 Resource Manager 资源的过程,并以并排方式让此转换过程直观可见. 检查:登录到门户并抽查属性和资源,来验证元数据的迁移是否正常. 提交/

【ORACLE】ASM磁盘组增删disk成员方法

************************************************************************   ****原文:blog.csdn.net/clark_xu 徐长亮的专栏 ************************************************************************ 第一步,关闭库shutdown immediate 第二步,查看dg的Mount diskgroup情况 SQL> show pa

【汇总】国际会议 信息安全相关 -- 2014-9更新

想要了解最新的学术研究动态,时刻track顶级的会议,顶级的workshop,顶级的researcher都是必要的. 添加了自己需要的会议最新日期,以及最新结束会议.并收集它们的论文集. 下面就是参考别人的表格,自己汇总的一个表格,根据会议的CIF( Conference Impact Factor )进行排列,不一定权威.将不定期更新 RK Conference Lasted updated R1 1.IEEE S&P IEEE Symposium on Security and Privac

【codevs2822】爱在心中 tarjan 缩点+理解

[codevs2822]爱在心中 2014年1月26日5580 题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度里有N个人,在他们的心中都有着一个爱的名单,上面记载着他所爱的人(不会出现自爱的情况).爱是具有传递性的,即如果A爱B,B爱C,则A也爱C.如果有这样一部分人,他们彼此都相爱,则他们就超越了一切的限制,用集体的爱化身成为一个爱心天使.现

【ThinkingInC++】36、联合体

/** * 书本:[ThinkingInC++] * 功能:联合 * 时间:2014年9月6日14:51:40 * 作者:cutter_point */ #include<iostream> using namespace std; union U { private: int i; float f; public: U(int a); U(float b); ~U(); int read_int(); float read_float(); }; U::U(int a) { i=a; } U

【bzoj3343】教主的魔法 分块

[bzoj3343]教主的魔法 2014年4月26日8092 Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第L(R)个英雄的身高) CYZ.光哥和ZJQ等