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

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

友链

https://blog.csdn.net/lee_ham/article/details/78398551

下载之后,看看C的源码

if( (key1()+key2()+key3()) == key ){
printf("Congratz!\n");
int fd = open("flag", O_RDONLY);
char buf[];
int r = read(fd, buf, );
write(, buf, r);

(key1()+key2()+key3()) == key就可以获得flag

之后打开另一个文件,是asm汇编语言,一个main函数和三个小部分key

来逐一看看key的数值

key1

(gdb) disass key1
Dump of assembler code for function key1:
0x00008cd4 <+>: push {r11} ; (str r11, [sp, #-]!)
0x00008cd8 <+>: add r11, sp, #
0x00008cdc <+8>: mov r3, pc
0x00008ce0 <+12>: mov r0, r3
0x00008ce4 <+>: sub sp, r11, #
0x00008ce8 <+>: pop {r11} ; (ldr r11, [sp], #)
0x00008cec <+>: bx lr
End of assembler dump.

将PC赋值给r3,然后r3在给r0,而r0是函数的返回值,PC(program point)指向的是执行语句地址+8,即0x08cdc+8=0x08ce4,所以key1是0x08ce4

key2

(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 <+12>: add r6, pc, #1
0x00008d00 <+16>: bx r6
0x00008d04 <+20>: mov r3, pc
0x00008d06 <+22>: adds r3, #4
0x00008d08 <+24>: push {r3}
0x00008d0a <+26>: pop {pc}
0x00008d0c <+28>: pop {r6} ; (ldr r6, [sp], #4)
0x00008d10 <+32>: mov r0, r
0x00008d14 <+>: sub sp, r11, #
0x00008d18 <+>: pop {r11} ; (ldr r11, [sp], #)
0x00008d1c <+>: bx lr

先看到pc和r6相加 0x08d04+0x1,然后再bx r6变成thumb状态(根据地址的最低位确定是否状态切换。如果末尾是1则切换到thumb状态,否则保留在asm状态)

之后pc+4赋值给r3(thumb状态,pc+4,asm状态则+8) 再通过adds把r3再加0x4,通过两次相加使得r3=PC+4+4,再赋值给r0 ,

所以r0=PC+4+4=0x8d0c, 即key2=0x8d0c

key3

Dump of assembler code for function key3:
0x00008d20 <+>: push {r11} ; (str r11, [sp, #-]!)
0x00008d24 <+>: add r11, sp, #
0x00008d28 <+8>: mov r3, lr
0x00008d2c <+12>: mov r0, r3
0x00008d30 <+>: sub sp, r11, #
0x00008d34 <+>: pop {r11} ; (ldr r11, [sp], #)
0x00008d38 <+>: bx lr

lr(link register)寄存器存储的是函数的返回地址,指向main函数,看看main函数

 0x00008d7c <+>:    bl    0x8d20 <key3>
0x00008d80 <+>: mov r3, r0

key3=0x8d80

之后相加即可

执行获取flag

My daddy has a lot of ARMv5te muscle!

Pwnable-leg的更多相关文章

  1. 【pwnable.kr】leg

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

  2. pwnable.kr leg之write up

    看代码: #include <stdio.h> #include <fcntl.h> int key1(){ asm("mov r3, pc\n"); } ...

  3. pwnable.kr之leg

    查看原题代码: #include <stdio.h> #include <fcntl.h> int key1(){ asm("mov r3, pc\n"); ...

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

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

  5. pwnable.kr的passcode

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

  6. I had lots of shrapnel in my leg

    People were running up to us, and screaming and hitting us, and throwing stones and eggs. "They ...

  7. pwnable echo2

    pwnable echo2 linux 32位程序 涉及FSB和UAF漏洞的利用,先%x泄露地址,然后利用UAF漏洞进行利用 code:

  8. pwnable.kr-bof

    .Nana told me that buffer overflow is one of the most common software vulnerability. Is that true? D ...

  9. pwnable.kr-collision

    题目: 链接后登陆 ssh col@pwnable.kr -p2222 查看文件以及权限 Ls –al 查看代码 cat col.c 根据 if(strlen(argv[1]) != 20){ pri ...

  10. pwnable.kr-fd

    题目: 链接登录: ssh fd@pwnable.kr -p2222 查看文件及权限: ls –al 看到flag文件,但是当前用户fd并没有读权限. cat fd.c 分析程序: int argc ...

随机推荐

  1. python连接MySQL pymysql模块,游标,SQL注入问题,增删改查操作

    pymysql模块 pymysql是用python控制终端对MySQL数据库进行操作的第三方模块 import pymysql # 1.连接数据库 client = pymysql.connect( ...

  2. acwing 50. 序列化二叉树

    地址 https://www.acwing.com/problem/content/46/ 请实现两个函数,分别用来序列化和反序列化二叉树. 您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序 ...

  3. acwing 60. 礼物的最大价值

    地址 https://www.acwing.com/problem/content/56/ 在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0). 你可以从棋盘的左上角开始拿 ...

  4. C语言程序设计100例之(13):最大子段和

    例13        最大子段和 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大.例如在序列2,-4,3,-1,2,-4,3中,最大的子段和为4,该子段为3,-1,2. 输入格式 第一 ...

  5. C语言程序设计100例之(3): Cantor表

    例3    Cantor表 题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1  1/2  1/3  1/4  …… 2/1 ...

  6. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 6

    18.5.3  PDO的错误处理模式 PDO共提供了3种不同的错误处理模式,不仅可以满足不同风格的编程,也可以调整扩展处理错误的方式. 1.PDO::ERRMODE_SILENT 这是默认模式,在错误 ...

  7. Spring MVC整合FreeMarker

    什么是Freemarker?    FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或 ...

  8. .net 数据源DataSet 转换成模型

    /// <summary> /// DataSet转换成model 自动赋值返回集合 /// </summary> /// <typeparam name="T ...

  9. go开发注意事项和dos的一些操作

    不需要加分号 写法 go编译器一行一行编译,所以多条语句不能写在同一行,否则会报错 go语言定义的变量或者import的包如果没有使用到,代码不能通过编译 func main() { ... } 只能 ...

  10. python中反转列表的三种方式

    1.内建函数reversed() li =[1, 2, 3, 4, 5, 6] a = list(reversed(li)) print (a) 注意:reversed()函数返回的是一个迭代器,而不 ...