Gjianhao


  • 首页

  • 归档

  • 标签

  • 分类

  • 关于

汇编还原高级代码-if判断

发表于 2018-09-20   |     |   阅读次数
上一篇已经介绍了简单代码的还原,下面记录一下 if 条件判断的代码还原。
高级代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
int g = 12;
void func(int a,int b){
if (a > b) {
g = a;
}else{
g = b;
}
}
int main(int argc, char * argv[]) {
func(1, 2);
}

通过 ida 得到的汇编代码如下:

1
2
3
4
5
6
__text:00000001000068B4 _func ; CODE XREF: _main+24↓p
__text:00000001000068B4
__text:00000001000068B4 var_8 = -8
__text:00000001000068B4 var_4 = -4
__text:00000001000068B4
__text:00000001000068B4 SUB SP, SP, #0x10
上面的代码还是开辟栈空间 。
1
2
3
4
__text:00000001000068B8 STR W0, [SP,#0x10+var_4]
__text:00000001000068BC STR W1, [SP,#0x10+var_8]
__text:00000001000068C0 LDR W0, [SP,#0x10+var_4]
__text:00000001000068C4 LDR W1, [SP,#0x10+var_8]
上面判断这个 func 方法有两个参数;
1
2
3
// if (a > b) {
__text:00000001000068C8 CMP W0, W1
__text:00000001000068CC B.LE loc_1000068E4
上面的比较相当于 if 语句,小于等于的话执行后面的地址,否则的话继续执行下面的方法;
1
2
3
__text:00000001000068D0 ADRP X8, #_g@PAGE
__text:00000001000068D4 ADD X8, X8, #_g@PAGEOFF
// int *X8 = &9;
得到一个全局变量 g的地址 ,放到 X8中, x8是个地址,
1
2
3
4
__text:00000001000068D8 LDR W9, [SP,#0x10+var_4]
// int w9 = var_4;
__text:00000001000068DC STR W9, [X8]
// *x8 = w9;
将 w9的值赋给 x8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
__text:00000001000068E0 B loc_1000068F4
__text:00000001000068E4 ; ---------------------------------------------------------------------------
__text:00000001000068E4
__text:00000001000068E4 loc_1000068E4 ; CODE XREF: _func+18↑j
__text:00000001000068E4 ADRP X8, #_g@PAGE
__text:00000001000068E8 ADD X8, X8, #_g@PAGEOFF
__text:00000001000068EC LDR W9, [SP,#0x10+var_8]
__text:00000001000068F0 STR W9, [X8]
__text:00000001000068F4
__text:00000001000068F4 loc_1000068F4 ; CODE XREF: _func+2C↑j
__text:00000001000068F4 ADD SP, SP, #0x10
__text:00000001000068F8 RET
__text:00000001000068F8 ; End of function _func
__text:00000001000068F8
__text:00000001000068FC
__text:00000001000068FC ; =============== S U B R O U T I N E =======================================
__text:00000001000068FC
__text:00000001000068FC ; Attributes: bp-based frame
__text:00000001000068FC
__text:00000001000068FC ; int __cdecl main(int argc, const char **argv, const char **envp)
下面是mian 函数的汇编:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
__text:00000001000068FC EXPORT _main
__text:00000001000068FC _main
__text:00000001000068FC
__text:00000001000068FC var_10 = -0x10
__text:00000001000068FC var_4 = -4
__text:00000001000068FC var_s0 = 0
__text:00000001000068FC
__text:00000001000068FC SUB SP, SP, #0x20
__text:0000000100006900 STP X29, X30, [SP,#0x10+var_s0]
__text:0000000100006904 ADD X29, SP, #0x10
__text:0000000100006908 MOV W8, #1
__text:000000010000690C MOV W9, #2
__text:0000000100006910 STUR W0, [X29,#var_4]
__text:0000000100006914 STR X1, [SP,#0x10+var_10]
__text:0000000100006918 MOV X0, X8
__text:000000010000691C MOV X1, X9
__text:0000000100006920 BL _func
__text:0000000100006924 MOV W8, #0
__text:0000000100006928 MOV X0, X8
__text:000000010000692C LDP X29, X30, [SP,#0x10+var_s0]
__text:0000000100006930 ADD SP, SP, #0x20
__text:0000000100006934 RET
__text:0000000100006934 ; End of function _main

简单汇编还原高级代码

发表于 2018-09-16   |     |   阅读次数
汇编还原高级代码在逆向开发中是非常重要的一步,下面通过一小段高级代码生成的汇编代码,根据汇编还原高级代码,步骤及笔记如下:

原高级代码:

1
2
3
4
5
6
7
8
9
10
11
int globala = 12;
int func(int a, int b){
printf("haha");
return a + b + globala;
}
int main(int argc, char * argv[]) {
func(10,20);
return 0;
}

阅读全文 »

python格式化输出

发表于 2017-09-09   |     |   阅读次数
格式化输出,格式化整数和浮点数还可以指定是否补 0 和整数与小数的位数
1
2
print('%04d-%02d-%02d'%(17, 8, 26)) #2017-08-26
print('%.2f'%3.1415) # 小数点后保留两位

python字符编码的表示

发表于 2017-09-09   |     |   阅读次数
1
Python 的浮点数也没有大小限制,但是超出一定范围就直接表示为 `inf` (无限大)。

  • 一个字节有8位(bit)表示最大整数是255,
  • 两个字节最大表示整数65535,
  • 4个字节最大表示4294967295;
  • ASCII编码中每一个字符使用一个字节,
  • Unicode编码每一个字符使用2个字节,
  • 这样如果文本使用全部英文表示,就比较浪费内存,所以推出UTF-8编码,英文字符使用一个字节,中文字符使用3个字节,偏僻的生字使用4-6个字节,
  • 在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就会转换为utf-8编码
    对于单个字符的编码,Python供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:
1
2
print(ord('人生苦短'))
print(chr(12002))
如果要在网络上传输,或者保存到磁盘上,就需要把 str 变为以字节为单位的 bytes。
1
2
print('abc'.encode('ascii'))
print('人生苦短'.encode('utf-8'))
这样表示会报错,因为汉字在ASCII中没有编码
1
# print('人生苦短'.encode('ascii'))
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把 bytes 变为 str,就需要用 decode()方法:
1
2
print(b'abc'.decode('ascii'))
print(b'\xe9\x83\xad\xe5\x81\xa5\xe8\xb1\xaa'.decode('utf-8'))

python中除法表达

发表于 2017-09-09   |     |   阅读次数

Python中的除法:’/‘和’//‘,前者是我们数学意义上的除法,结果是什么就是什么,无限循环小数都可以,后者得到的结果只是取结果的整数部分,也就是结果永远是整数,在Java和OC中用’/‘表示。

1
print('10 / 3 =', 10 / 3)

‘//‘除法得到的结果只取整数部分

1
print('10 // 3 =',10 // 3)

python中不让转义字符生效

发表于 2017-09-09   |     |   阅读次数

转义字符表示

1
print('\\\n\\')

也可以不让转义字符生效,在字符串前面加上r

1
print(r'\\\n\\')

快捷保存手机号码到通讯录-类似微信

发表于 2016-12-04   |     |   阅读次数

快捷保存手机号码到系统通讯录中的需求在很多的应用中都会用的到,QQ、微信等社交软件都是可以见到的,虽然实现起来也是很简单的,小编还是把这个小功能整理一下,方便后面在需要的时候能方便的使用,也能方便朋友们能感到方便。有需要的直接可以拿去,甚是方便,废话不多说,代码已经上传Github:JHContacts

效果图如下:

阅读全文 »

开始我的第一篇博客

发表于 2016-11-26   |     |   阅读次数

搭建好自己的博客是一件很兴奋的事,已经迫不及待的在这上面写一些东西,但是现在还没有准备好自己的技术文章,不过很快的就会陆续在这里更新我在开发工作中遇到的问题和经验,希望能和同仁一同分享,共同进步,在自己的技术之路上更上一层楼;下面是一些我收集的开发中非常有用的学习博客:

  • iOS常用开发库
  • iOS开发博客列表
    阅读全文 »

Hello World

发表于 2016-09-11   |     |   阅读次数

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

阅读全文 »
kevinBin

kevinBin

“只有当我们意识到自己所拥有的事物的时候,才是真实地活在这个世界上。”

9 日志
4 标签
GitHub 微博 简书 博客园
Links
  • 简书
© 2018 kevinBin