博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【pwnable.kr】 leg - ARM汇编 PC LR 寄存器 、THUMB汇编
阅读量:4206 次
发布时间:2019-05-26

本文共 814 字,大约阅读时间需要 2 分钟。

 

本关主要涉及了一些arm汇编的知识。

阅读leg.c源码发现,本关调用scanf从标准输入读取key后,判断是否和key1 key2 key3 三个函数的返回值的和相等。如果相等,则输出flag。但是ARM汇编的函数返回值和寄存器R0有关,并且key函数中涉及到了PC LR 寄存器的操作。因此需要阅读汇编。

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

 阅读leg.asm的汇编。

key1函数中,r0的值是由0x8cdc处PC寄存器的值。由于ARM处理器的三级流水线机制,执行到0x8cdc时,CPU已经完成了0x8cdc处指令的翻译操作和0x8ce4处的解释操作。因此PC寄存器的值是0x8cdc+4+4。r0 = 0x8cdc+8。

 

key2函数同理,但是由于bx r6,r6最后一位为1,cpu切换到thumb模式,每条指令2byte。因此PC=0x8d04+2+2。r0 = 0x8d04+2+2+4。

key3函数中,r0是寄存器LR的值,LR是当前函数的返回值,通过查看main函数中key3的返回值可知LR=0x8d80。因此r0 = 0x8d80。

最终key1()+key2()+key3() = 0x8cdc+4+4 + 0x8dc4+2+2+4 + 0x8d80 = 108400。

flag

 

你可能感兴趣的文章
php图像处理函数大全(缩放、剪裁、缩放、翻转、旋转、透明、锐化的实例总结)
查看>>
magento url中 uenc 一坨编码 base64
查看>>
强大的jQuery焦点图无缝滚动走马灯特效插件cxScroll
查看>>
Yii2.0 数据库查询
查看>>
yii2 db 操作
查看>>
mongodb group 有条件的过滤组合个数。
查看>>
yii2 用命令行操作web下的controller
查看>>
关于mongodb的 数组分组 array group
查看>>
MongoDB新的数据统计框架介绍
查看>>
mongodb fulltextsearch 关于语言的设置选项
查看>>
mongodb 增加全文检索索引
查看>>
symfony
查看>>
yourls 短连接 安装
查看>>
yii2 php namespace 引入第三方非namespace库文件时候,报错:Class not found 的解决
查看>>
softlayer 端口开放
查看>>
操作1:mongodb安装
查看>>
操作2:mongodb使用语法
查看>>
如何给分类增加一个属性(后台)
查看>>
linux设置环境变量 临时设置 和 永久设置
查看>>
mysql数据库主从同步的问题解决方法
查看>>