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=0;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[100];int r = read(fd, buf, 100);write(0, buf, r);}else{printf("I have strong leg :P\n");}return 0;
}

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

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

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

(gdb) disass main
Dump of assembler code for function main:0x00008d3c <+0>:    push    {r4, r11, lr}0x00008d40 <+4>:    add    r11, sp, #80x00008d44 <+8>:    sub    sp, sp, #120x00008d48 <+12>:    mov    r3, #00x00008d4c <+16>:    str    r3, [r11, #-16]0x00008d50 <+20>:    ldr    r0, [pc, #104]    ; 0x8dc0 <main+132>0x00008d54 <+24>:    bl    0xfb6c <printf>0x00008d58 <+28>:    sub    r3, r11, #160x00008d5c <+32>:    ldr    r0, [pc, #96]    ; 0x8dc4 <main+136>0x00008d60 <+36>:    mov    r1, r30x00008d64 <+40>:    bl    0xfbd8 <__isoc99_scanf>0x00008d68 <+44>:    bl    0x8cd4 <key1>0x00008d6c <+48>:    mov    r4, r00x00008d70 <+52>:    bl    0x8cf0 <key2>0x00008d74 <+56>:    mov    r3, r00x00008d78 <+60>:    add    r4, r4, r30x00008d7c <+64>:    bl    0x8d20 <key3>0x00008d80 <+68>:    mov    r3, r00x00008d84 <+72>:    add    r2, r4, r30x00008d88 <+76>:    ldr    r3, [r11, #-16]0x00008d8c <+80>:    cmp    r2, r30x00008d90 <+84>:    bne    0x8da8 <main+108>0x00008d94 <+88>:    ldr    r0, [pc, #44]    ; 0x8dc8 <main+140>0x00008d98 <+92>:    bl    0x1050c <puts>0x00008d9c <+96>:    ldr    r0, [pc, #40]    ; 0x8dcc <main+144>0x00008da0 <+100>:    bl    0xf89c <system>0x00008da4 <+104>:    b    0x8db0 <main+116>0x00008da8 <+108>:    ldr    r0, [pc, #32]    ; 0x8dd0 <main+148>0x00008dac <+112>:    bl    0x1050c <puts>0x00008db0 <+116>:    mov    r3, #00x00008db4 <+120>:    mov    r0, r30x00008db8 <+124>:    sub    sp, r11, #80x00008dbc <+128>:    pop    {r4, r11, pc}0x00008dc0 <+132>:    andeq    r10, r6, r12, lsl #90x00008dc4 <+136>:    andeq    r10, r6, r12, lsr #90x00008dc8 <+140>:            ; <UNDEFINED> instruction: 0x0006a4b00x00008dcc <+144>:            ; <UNDEFINED> instruction: 0x0006a4bc0x00008dd0 <+148>:    andeq    r10, r6, r4, asr #9
End of assembler dump.
(gdb) disass key1
Dump of assembler code for function key1:0x00008cd4 <+0>:    push    {r11}        ; (str r11, [sp, #-4]!)0x00008cd8 <+4>:    add    r11, sp, #00x00008cdc <+8>:    mov    r3, pc0x00008ce0 <+12>:    mov    r0, r30x00008ce4 <+16>:    sub    sp, r11, #00x00008ce8 <+20>:    pop    {r11}        ; (ldr r11, [sp], #4)0x00008cec <+24>:    bx    lr
End of assembler dump.
(gdb) disass key2
Dump of assembler code for function key2:0x00008cf0 <+0>:    push    {r11}        ; (str r11, [sp, #-4]!)0x00008cf4 <+4>:    add    r11, sp, #00x00008cf8 <+8>:    push    {r6}        ; (str r6, [sp, #-4]!)0x00008cfc <+12>:    add    r6, pc, #10x00008d00 <+16>:    bx    r60x00008d04 <+20>:    mov    r3, pc0x00008d06 <+22>:    adds    r3, #40x00008d08 <+24>:    push    {r3}0x00008d0a <+26>:    pop    {pc}0x00008d0c <+28>:    pop    {r6}        ; (ldr r6, [sp], #4)0x00008d10 <+32>:    mov    r0, r30x00008d14 <+36>:    sub    sp, r11, #00x00008d18 <+40>:    pop    {r11}        ; (ldr r11, [sp], #4)0x00008d1c <+44>:    bx    lr
End of assembler dump.
(gdb) disass key3
Dump of assembler code for function key3:0x00008d20 <+0>:    push    {r11}        ; (str r11, [sp, #-4]!)0x00008d24 <+4>:    add    r11, sp, #00x00008d28 <+8>:    mov    r3, lr0x00008d2c <+12>:    mov    r0, r30x00008d30 <+16>:    sub    sp, r11, #00x00008d34 <+20>:    pop    {r11}        ; (ldr r11, [sp], #4)0x00008d38 <+24>:    bx    lr
End of assembler dump.
(gdb) 

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

key1()

   0x00008cdc <+8>:    mov    r3, pc0x00008ce0 <+12>:    mov    r0, r3

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

key2()

   0x00008cfc <+12>:    add    r6, pc, #10x00008d00 <+16>:    bx    r60x00008d04 <+20>:    mov    r3, pc0x00008d06 <+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, lr0x00008d2c <+12>:    mov    r0, r3

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

   0x00008d80 <+68>:    mov    r3, r0

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

转载于:https://www.cnblogs.com/p4nda/p/7123487.html

【pwnable.kr】leg相关推荐

  1. 【pwnable.kr】day8:leg

    pwnable:leg pwnable.kr:leg 题目链接 question Daddy told me I should study arm. But I prefer to study my ...

  2. 【pwnable.kr】Toddler‘s Bottle-[flag]

    目录导航 下载题目文件 二进制分析 获取flag gdb调试 下载题目文件 Papa brought me a packed present! let's open it.Download : htt ...

  3. 【pwnable.kr】passcode

    pwnable从入门到放弃,第六题. ssh passcode@pwnable.kr -p2222 (pw:guest) 完全是'&'的锅. #include <stdio.h> ...

  4. 【pwnable.kr】 alloca

    https://www.anquanke.com/post/id/170288 前言 最近在刷pwnable.kr [Rookiss],题目都好有意思,一其中题alloca虽然分值不高,但分析过程很值 ...

  5. 【pwnable.kr】Toddler‘s Bottle-[passcode]

    目录导航 进入服务器 下载文件 反编译分析 EXP TIPS 进入服务器 Mommy told me to make a passcode based login system. My initial ...

  6. 【pwnable.kr】Toddler‘s Bottle-[random]

    目录导航 Target & Download Analysis & IDA Debug & writeup TIPS Target & Download Daddy, ...

  7. 【pwnable.kr】Toddler‘s Bottle-[bof]

    目录导航 打开题目审题 nc 命令介绍 获取服务器文件 源代码分析 ELF分析构造payload 解题 打开题目审题 Nana told me that buffer overflow is one ...

  8. 【pwnable.kr】Toddler‘s Bottle-[fd]

    目录导航 打开题目审题 找到突破口 相关c语言知识 源代码分析 找到FLAG 打开题目审题 Mommy! what is a file descriptor in Linux?* try to pla ...

  9. 【pwnable.kr】 passcode

    https://r00tnb.github.io/2017/12/10/pwnable.kr-passcode/ 分析 首先读源码passcode.c 1 2 3 4 5 6 7 8 9 10 11 ...

最新文章

  1. 做销售如何跟单,逼单!共20招!(转)
  2. 字符串的最大相似匹配
  3. oracle如何查看数据安全用户,oracle用户安全管理
  4. 成都郫县php开发学校_成都各区九年制学校、十二年制学校汇总
  5. matlab作图如何改变坐标刻度
  6. 深度探索C++ 对象模型(6)-Data member的存取
  7. 数据结构--稀疏矩阵的一种实现
  8. gdb x命令_详解gdb的使用技巧
  9. OPENSSL_1.0.2' not found
  10. 最全面的MySQL笔记
  11. Java的五子棋实现,java开发面试笔试题
  12. java excel导出 模板_Java Excel 导出 模板
  13. ShiftViT用Swin Transformer的精度跑赢ResNet的速度,论述ViT的成功不在注意力!
  14. DB2分区表删除和添加分区
  15. Qt中通过Qpixmap设置图片透明度
  16. 研究生硕士论文开题报告中的进度和安排该怎么写?
  17. 盗火:硅谷、海豹突击队和疯狂科学家如何变革我们的工作和生活
  18. 1483选票统计(一)(结构体专题)
  19. 群表示论之Able群的不可约表示
  20. 比较五种搜索Rapidshare的方法

热门文章

  1. android 内存溢出问题分析
  2. DaVinci Resolve Studio 18(达芬奇剪辑软件)
  3. 我的世界mod整合包java_我的世界1.10.2mod大全+整合包+合集
  4. 揭秘:日赚千元的冷门暴利项目,这个产品99%的人不知道
  5. 中国12家云平台实际进展情况,看完这篇你就全部了解了!
  6. 利用JavaScript计算圆的面积
  7. 【文献导读】XPBD: Position-Based Simulation of Compliant Constrained Dynamics
  8. 初学:什么是pacman以及pacman的使用方法
  9. RK3399平台开发系列讲解(网络篇)7.25、Socket接口的分层
  10. 关于DWA导致的程序崩溃或挂死问题