查看原题代码:

#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 ;
}

知道我们只要使输入的值等于 key1()+key2()+key3() ,就能拿到flag

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.

核心代码为:

   0x00008cdc <+>:    mov    r3, pc
0x00008ce0 <+>: mov r0, r3

意思是把pc寄存器的值传递给r3寄存器,再把r3寄存器的值传递给r0,然后r0寄存器的值作为函数的返回值

在ARM汇编指令中,寄存器pc的值为当前指令地址加8个字节,所以寄存器pc中的值为 0x00008cdc+8,则函数返回值为 0x00008cdc+8

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.

核心代码为:

   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

pc寄存器的值为:0x00008cfc+8 ,则r6寄存器的值为:pc+1=0x00008cfc+8+1,第二行指令  bx 是跳转指令,并且还会根据目标地址最低位判断是否更该处理的状态,此时 r6=0x00008cfc+8+1=0x00008d05,转化为二进制为 1000110100000101,最低位为1,所以应该转换为 Thumb状态。

由于转换状态,第三行汇编代码中pc=0x00008d04+4(注意:只增加4个字节),所以 r3=pc=0x00008d04+4

第四行,r3存储的值加4,值为 0x00008d04+4+4,按顺序执行下去可得最后 key2() 的返回值为:0x00008d04+4+4

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.

核心代码为:

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

lr寄存器存储的是当前函数执行完毕后的返回地址,故需要去main()函数中去找:

   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

观察可知 lr的值为 0x00008d80,故key3()的返回值为: 0x00008d80

那么我们最后应该输入的值为 :0x00008cdc+8+0x00008d04+4+4+0x00008d80=1A770,由于题目要求输入十进制,故转化为十进制为 108400

flag为:My daddy has a lot of ARMv5te muscle!

  1. 知道C语言可以内嵌汇编代码,并了解了内嵌汇编的基本语法
  2. 学习了ARM汇编指令,在ARM汇编中,其寄存器是r0~r15,其中r13(别名:sp),它通常指向通常指向异常模式所专用的堆栈,也就是说五种异常模式、非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引。这样当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性。lr(r14),存放的是函数的返回地址,一般调用子函数用的比较多,pc(r15),值为当前操作的地址
  3. 放几个写得比较好的博客:https://blog.csdn.net/bytxl/article/details/49883103

https://blog.csdn.net/aguangg_6655_la/article/details/53613270

pwnable.kr之leg的更多相关文章

  1. 【pwnable.kr】leg

    pwnable从入门到放弃第八题. Download : http://pwnable.kr/bin/leg.cDownload : http://pwnable.kr/bin/leg.asm ssh ...

  2. pwnable.kr详细通关秘籍(二)

    i春秋作家:W1ngs 原文来自:pwnable.kr详细通关秘籍(二) 0x00 input 首先看一下代码: 可以看到程序总共有五步,全部都满足了才可以得到flag,那我们就一步一步来看 这道题考 ...

  3. pwnable.kr的passcode

    前段时间找到一个练习pwn的网站,pwnable.kr 这里记录其中的passcode的做题过程,给自己加深印象. 废话不多说了,看一下题目, 看到题目,就ssh连接进去,就看到三个文件如下 看了一下 ...

  4. pwnable.kr bof之write up

    这一题与前两题不同,用到了静态调试工具ida 首先题中给出了源码: #include <stdio.h> #include <string.h> #include <st ...

  5. pwnable.kr col之write up

    Daddy told me about cool MD5 hash collision today. I wanna do something like that too! ssh col@pwnab ...

  6. pwnable.kr brainfuck之write up

    I made a simple brain-fuck language emulation program written in C. The [ ] commands are not impleme ...

  7. pwnable.kr login之write up

    main函数如下: auth函数如下: 程序的流程如下: 输入Authenticate值,并base64解码,将解码的值代入md5_auth函数中 mad5_auth()生成其MD5值并与f87cd6 ...

  8. pwnable.kr simple login writeup

    这道题是pwnable.kr Rookiss部分的simple login,需要我们去覆盖程序的ebp,eip,esp去改变程序的执行流程   主要逻辑是输入一个字符串,base64解码后看是否与题目 ...

  9. pwnable.kr第二天

    3.bof 这题就是简单的数组越界覆盖,直接用gdb 调试出偏移就ok from pwn import * context.log_level='debug' payload='A'*52+p32(0 ...

随机推荐

  1. Django中的ORM如何通过数据库中的表格信息自动化生成Model 模型类?

    Inspectdb Django项目通过绑定的数据库中的相应表格直接自动化生成Model 模型类 python manage.py inspectdb Django 中的 ORM 可以实现对象关系映射 ...

  2. SqlServer 版本号

    RTM (no SP) SP1 SP2 SP3 SP4 SQL Server 2014      codename Hekaton  12.00.2000.8 SQL Server 2012      ...

  3. LeetCode 122 best-time-to-buy-and-sell-stock-ii 详解

    题目描述 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你 ...

  4. 01 树莓派4B—C语言编程——GPIO

    #include <stdio.h>#include <wiringPi.h> int main( void){ int LED1 = 1; int LED4 = 4; wir ...

  5. Js~对键值对操作

    键值对主要是面向对象语言里的字典,或者叫哈希表,它通过键(key)可以直接访问到值(value),所以它查找的时间复杂度是O(1),即一次查找即可找到目标:在.net里有Dictionary,而在ja ...

  6. 微信小程序内置组件web-view的缓存问题探讨

    前言:博客或者论坛上面,还有自习亲身经历,发现微信小程序的webview组件的页面缓存问题相当严重,对开发H5的小童鞋来说应该困扰了不少.很多小童鞋硬是抓破脑袋也没有办法解决这个问题,那我们今天就来探 ...

  7. linux驱动之模块化编程

    今天刚开始学习linux驱动的编写.在网上开了许多网友的博客,感觉比较好的摘抄下来,以便以后忘记可以随时查看.下面是摘抄文章的地址,非常感谢他们. http://blog.chinaunix.net/ ...

  8. J20航模遥控器开源项目系列教程(一)制作教程 | 基础版V1.0发布,从0到1

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...

  9. Robot Framework(3)——RIDE工具详解

    上一篇介绍了用RF来简单运行案例,此篇主要了解一下工具操作 一.菜单栏 1.File 1>New Project:新建工程 2>Open Test Suite:打开测试套件 3>Op ...

  10. DeepCoder: A Deep Neural Network Based Video Compression

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract: 在深度学习的最新进展的启发下,我们提出了一种基于卷积神经网络(CNN)的视频压缩框架DeepCoder.我们分别对预测 ...