OSX裸函数应用实战 -- by 飘云
////main.m
//debug
//
//Created by piao on 15/7/20.
//Copyright (c) 2015年 piao. All rights reserved.
//
#import <Foundation/Foundation.h>
__attribute__((naked)) uint64_t getRbp()
{
__asm__("mov %rbp, %rax\n\n\r"
"ret");
}
// 嘿嘿,shellcode经常用到滴...
__attribute__((naked)) uint64_t getRip()
{
__asm__("call 0f\n\n\r"
"0:pop %rax\n\n\r"
//"sub $5, %rax\n\n\r" // 减去指令长度
"ret");
}
__attribute__((naked)) uint64_t getRsp()
{
__asm__("mov %rsp, %rax\n\n\r"
"ret");
}
void piaoyun(){
NSLog(@"[++++]一层返回 = %llx", getRip() - 5);
NSLog(@"[++++]二层返回 = %llx", *(uint64_t *)(getRbp() + 0x8));
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
piaoyun();
}
return 0;
}嘿嘿,至于能干嘛,我就不说了。我经常用到,屡试不爽~~
这个高级
看不懂 本帖最后由 wx_f1Jji177 于 2015-7-21 01:50 编辑
一层的getRIP怎么个玩法,没搞懂,{:soso_e117:}//"sub $5, %rax\n\n\r" // 减去指令长度
就是在这里可以放入shellcode来加入自己的代码段?
学习新单词啦:naked~, naked~, naked~,{:soso_e113:}, naked属性,编译器不会生成任何函数入口代码和退出代码,不写return也可以编译过,
不错不错、、、、{:soso_e163:} wx_f1Jji177 发表于 2015-7-21 00:37
一层的getRIP怎么个玩法,没搞懂,//"sub $5, %rax\n\n\r" // 减去指令长度
就是在这里可 ...
自己写ret是个良好的习惯,你恰好遇到的是GCC默认编译。。会给你提供ret,某些编译器不会添加任何返回代码
飘云 发表于 2015-7-21 09:43
自己写ret是个良好的习惯,你恰好遇到的是GCC默认编译。。会给你提供ret,某些编译器不会添加任何返回代 ...
的确,编译器还是会自动加结尾:
mov %rax, %rbp
ret
gao高端,看不懂~~~ 收藏先~ 表示看不懂 shellcode,很爽~~~
页:
[1]