pwnable从入门到放弃第八题。

Download : http://pwnable.kr/bin/leg.c
Download : http://pwnable.kr/bin/leg.asm

ssh leg@pwnable.kr -p2222 (pw:guest)

先下载这两个文件:leg.c

#include <stdio.h>
#include <fcntl.h>
int key1(){
asm("mov r3, pc\n");
}
int key2(){
asm(
"push {r6}\n"
"add r6, pc, $1\n"
"bx r6\n"
".code 16\n"
"mov r3, pc\n"
"add r3, $0x4\n"
"push {r3}\n"
"pop {pc}\n"
".code 32\n"
"pop {r6}\n"
);
}
int key3(){
asm("mov r3, lr\n");
}
int main(){
int key=;
printf("Daddy has very strong arm! : ");
scanf("%d", &key);
if( (key1()+key2()+key3()) == key ){
printf("Congratz!\n");
int fd = open("flag", O_RDONLY);
char buf[];
int r = read(fd, buf, );
write(, buf, r);
}
else{
printf("I have strong leg :P\n");
}
return ;
}

代码貌似逻辑很直接,就是输入key,当key=key1+key2+key3时就可以了。

但是3个函数居然都是汇编= =、、、 而且还是arm的。。 让不让人活了。。

leg.asm 还不如直接看全汇编

(gdb) disass main
Dump of assembler code for function main:
0x00008d3c <+>: push {r4, r11, lr}
0x00008d40 <+>: add r11, sp, #
0x00008d44 <+>: sub sp, sp, #
0x00008d48 <+>: mov r3, #
0x00008d4c <+>: str r3, [r11, #-]
0x00008d50 <+>: ldr r0, [pc, #] ; 0x8dc0 <main+>
0x00008d54 <+>: bl 0xfb6c <printf>
0x00008d58 <+>: sub r3, r11, #
0x00008d5c <+>: ldr r0, [pc, #] ; 0x8dc4 <main+>
0x00008d60 <+>: mov r1, r3
0x00008d64 <+>: bl 0xfbd8 <__isoc99_scanf>
0x00008d68 <+>: bl 0x8cd4 <key1>
0x00008d6c <+>: mov r4, r0
0x00008d70 <+>: bl 0x8cf0 <key2>
0x00008d74 <+>: mov r3, r0
0x00008d78 <+>: add r4, r4, r3
0x00008d7c <+>: bl 0x8d20 <key3>
0x00008d80 <+>: mov r3, r0
0x00008d84 <+>: add r2, r4, r3
0x00008d88 <+>: ldr r3, [r11, #-]
0x00008d8c <+>: cmp r2, r3
0x00008d90 <+>: bne 0x8da8 <main+>
0x00008d94 <+>: ldr r0, [pc, #] ; 0x8dc8 <main+>
0x00008d98 <+>: bl 0x1050c <puts>
0x00008d9c <+>: ldr r0, [pc, #] ; 0x8dcc <main+>
0x00008da0 <+>: bl 0xf89c <system>
0x00008da4 <+>: b 0x8db0 <main+>
0x00008da8 <+>: ldr r0, [pc, #] ; 0x8dd0 <main+>
0x00008dac <+>: bl 0x1050c <puts>
0x00008db0 <+>: mov r3, #
0x00008db4 <+>: mov r0, r3
0x00008db8 <+>: sub sp, r11, #
0x00008dbc <+>: pop {r4, r11, pc}
0x00008dc0 <+>: andeq r10, r6, r12, lsl #
0x00008dc4 <+>: andeq r10, r6, r12, lsr #
0x00008dc8 <+>: ; <UNDEFINED> instruction: 0x0006a4b0
0x00008dcc <+>: ; <UNDEFINED> instruction: 0x0006a4bc
0x00008dd0 <+>: andeq r10, r6, r4, asr #
End of assembler dump.
(gdb) disass key1
Dump of assembler code for function key1:
0x00008cd4 <+>: push {r11} ; (str r11, [sp, #-]!)
0x00008cd8 <+>: add r11, sp, #
0x00008cdc <+>: mov r3, pc
0x00008ce0 <+>: mov r0, r3
0x00008ce4 <+>: sub sp, r11, #
0x00008ce8 <+>: pop {r11} ; (ldr r11, [sp], #)
0x00008cec <+>: bx lr
End of assembler dump.
(gdb) disass key2
Dump of assembler code for function key2:
0x00008cf0 <+>: push {r11} ; (str r11, [sp, #-]!)
0x00008cf4 <+>: add r11, sp, #
0x00008cf8 <+>: push {r6} ; (str r6, [sp, #-]!)
0x00008cfc <+>: add r6, pc, #
0x00008d00 <+>: bx r6
0x00008d04 <+>: mov r3, pc
0x00008d06 <+>: adds r3, #
0x00008d08 <+>: push {r3}
0x00008d0a <+>: pop {pc}
0x00008d0c <+>: pop {r6} ; (ldr r6, [sp], #)
0x00008d10 <+>: mov r0, r3
0x00008d14 <+>: sub sp, r11, #
0x00008d18 <+>: pop {r11} ; (ldr r11, [sp], #)
0x00008d1c <+>: bx lr
End of assembler dump.
(gdb) disass key3
Dump of assembler code for function key3:
0x00008d20 <+>: push {r11} ; (str r11, [sp, #-]!)
0x00008d24 <+>: add r11, sp, #
0x00008d28 <+>: mov r3, lr
0x00008d2c <+>: mov r0, r3
0x00008d30 <+>: sub sp, r11, #
0x00008d34 <+>: pop {r11} ; (ldr r11, [sp], #)
0x00008d38 <+>: bx lr
End of assembler dump.
(gdb)

逐步跟踪分析一下各函数的返回值:

key1()

   0x00008cdc <+8>:    mov    r3, pc
0x00008ce0 <+12>: mov r0, r3 r0是函数的返回值,这个函数来源于pc,而pc指向的是执行语句行+8也就是0x00008cdc+0x8

key2()

   0x00008cfc <+12>:    add    r6, pc, #1
0x00008d00 <+16>: bx r6
0x00008d04 <+20>: mov r3, pc
0x00008d06 <+22>: adds r3, #4
0x00008d10 <+32>: mov r0, r3

从第一行起,add r6,pc,#1  r6=0x00008d04+0x1 = 0x00008d05

从而bx r6就跳转thumb模式下,该模式下pc= 执行语句地址+0x4

而后adds r3,#4 又对r3+0x4

因此 返回值 0x00008d04+0x4+0x4

a = 0x00008d80
b = 0x00008cdc +0x8
c = 0x00008d04 +0x4+0x4
print (a+b+c)

key3()

   0x00008d28 <+8>:    mov    r3, lr
0x00008d2c <+12>: mov r0, r3

返回值r0=lr,lr寄存器存储的是函数的返回地址,指向main函数中的

   0x00008d80 <+68>:    mov    r3, r0

一行,因此可算出key = key1()+key2()+key3()

【pwnable.kr】leg的更多相关文章

  1. 【pwnable.kr】 asm

    一道写shellcode的题目, #include <stdio.h> #include <string.h> #include <stdlib.h> #inclu ...

  2. 【pwnable.kr】 [simple login]

    Download : http://pwnable.kr/bin/login Running at : nc pwnable.kr 9003 先看看ida里面的逻辑. 比较重要的信息时input变量再 ...

  3. 【pwnable.kr】 brainfuck

    pwnable.kr第二关第一题: ========================================= Download : http://pwnable.kr/bin/bfDownl ...

  4. 【pwnable.kr】 unlink

    pwnable.kr 第一阶段的最后一题! 这道题目就是堆溢出的经典利用题目,不过是把堆块的分配与释放操作用C++重新写了一遍,可参考<C和C++安全编码一书>//不是广告 #includ ...

  5. 【pwnable.kr】 memcpy

    pwnable的新一题,和堆分配相关. http://pwnable.kr/bin/memcpy.c ssh memcpy@pwnable.kr -p2222 (pw:guest) 我觉得主要考察的是 ...

  6. 【pwnable.kr】 codemap

    pwnable新的一题. download: http://pwnable.kr/bin/codemap.exe ssh codemap@pwnable.kr -p2222 (pw:guest) 这道 ...

  7. 【pwnable.kr】 uaf

    目测是比较接近pwnable的一道题.考察了uaf(use after free的内容),我觉得说白了就是指针没有初始化的问题. ssh uaf@pwnable.kr -p2222 (pw:guest ...

  8. 【pwnable.kr】input

    这道题是一道一遍一遍满足程序需求的题. 网上其他的题解都是用了C语言或者python语言的本地调用,我想联系一下pwntools的远程调用就写了下面的脚本, 执行效果可以通过1~4的检测,到最后soc ...

  9. 【pwnable.kr】cmd2

    这道题是上一个cmd1的升级版 ssh cmd2@pwnable.kr -p2222 (pw:mommy now I get what PATH environmentis for :)) 登录之后, ...

随机推荐

  1. windowsService 程序

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. leetcode743 Network Delay Time

    """ here are N network nodes, labelled 1 to N. Given times, a list of travel times as ...

  3. 吴裕雄--天生自然JAVA数据库编程:SQL常用语句基础

    DROP TABLE user ; -- 删除表 CREATE TABLE user( id INT AUTO_INCREMENT PRIMARY KEY , name ) NOT NULL , pa ...

  4. 数据结构 c++ 广义表

    // CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...

  5. PAN3501与AS3933完美兼容替代

    现在不少校园门禁卡都是采用奥地利的AS3933,市场需求是供不应求,当然价格上还是不断上升趋势.成本上压力也是越来越大,不少厂家在寻找能替代软硬件兼容AS3933的芯片方案.今天我就为大家介绍一款能否 ...

  6. SDOI 种田记

    day3: 今天早上来重新看了一下,IQ--,智障的感觉2333.弱势围观了一发众神奔,发现好多人都A了第三题,然而回想起自己考试的时候傻傻的码第二题的错误代码,真的是感觉mdzz. 不想吐槽了,记得 ...

  7. UVA 12510/CSU 1119 Collecting Coins DFS

    前年的省赛题,难点在于这个石头的推移不太好处理 后来还是看了阳神当年的省赛总结,发现这个石头这里,因为就四五个子,就暴力dfs处理即可.先把石头当做普通障碍,进行一遍全图的dfs或者bfs,找到可以找 ...

  8. Mysql数据库的简单介绍与入门

    Mysql数据库的简单介绍与入门 前言 一.下载与安装 1.下载 官网下载MYSQL5.7.21版本,链接地址https://www.mysql.com/downloads/.下载流程图如下: 找到M ...

  9. Django(五)1 - 4章实战:从数据库读取图书列表并渲染出来、通过url传参urls.py path,re_path通过url传参设置、模板语法

    一.从数据库读取图书数据并渲染出来 1)app1/views.py函数books编写 [1]从模型下导入bookinfo信息 [2]从数据库获取图书对象列表 [3]把获取到的图书对象赋值给books键 ...

  10. win10热键体验

    Alt+Tab: 横向显示正在执行的进程 Win+Tab: 3D形式展示正在执行的进程 Win+D:返回桌面(逃领导查电脑和放窥屏尴尬) Win+R: run(直接打开文件开始运行) crtl+Alt ...