飘云 发表于 2015-7-20 18:30:18

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;
}嘿嘿,至于能干嘛,我就不说了。我经常用到,屡试不爽~~

wangwei628 发表于 2015-7-20 19:11:23

这个高级
看不懂

0xcb 发表于 2015-7-21 00:37:38

本帖最后由 wx_f1Jji177 于 2015-7-21 01:50 编辑

一层的getRIP怎么个玩法,没搞懂,{:soso_e117:}//"sub $5, %rax\n\n\r"   // 减去指令长度
就是在这里可以放入shellcode来加入自己的代码段?
学习新单词啦:naked~, naked~, naked~,{:soso_e113:}, naked属性,编译器不会生成任何函数入口代码和退出代码,不写return也可以编译过,


creantan 发表于 2015-7-21 09:26:09

不错不错、、、、{:soso_e163:}

飘云 发表于 2015-7-21 09:43:42

wx_f1Jji177 发表于 2015-7-21 00:37
一层的getRIP怎么个玩法,没搞懂,//"sub $5, %rax\n\n\r"   // 减去指令长度
就是在这里可 ...
自己写ret是个良好的习惯,你恰好遇到的是GCC默认编译。。会给你提供ret,某些编译器不会添加任何返回代码

0xcb 发表于 2015-7-21 10:00:41

飘云 发表于 2015-7-21 09:43
自己写ret是个良好的习惯,你恰好遇到的是GCC默认编译。。会给你提供ret,某些编译器不会添加任何返回代 ...

的确,编译器还是会自动加结尾:
mov %rax, %rbp
ret


niusiqiang 发表于 2015-7-21 11:33:24

gao高端,看不懂~~~

MOV 发表于 2015-7-21 12:56:29

收藏先~

一梦千年缘 发表于 2015-7-21 14:17:09

表示看不懂

tree_fly 发表于 2015-7-21 14:24:46

shellcode,很爽~~~
页: [1]
查看完整版本: OSX裸函数应用实战 -- by 飘云