NTTU CSclube pwn part 1.

資安社總務第二次上社課
Prepare
- VirtualMachine install tutorial
- ubuntu 22.04 LTS
- gdb
sudo apt udate; apt install gdb
- peda
- lab
x86_64 assembly
Registers
RAX RBX RCX RDX RDI RSI - 64 bit
EAX EBX ECX EDX EDI ESI - 32 bit
AX BX CX DX DI SI - 16 bit
AX -> AH AL - 8 bit
RSP
RBP
RIP
Instruction
- jmp
1 | # jmp a = |
- call
1 | # call a = |
- leave
1 | mov rsp,rbp |
- ret
1 | pop rip |
ELF
.bss
: 未初始化全域變數.data
: 初始化全域變數.rodata
:Read only data.text
: 程式碼段
readelf -S <elf>
1 | int a; |
- Read offset
1 | $readelf -S elf |
pwntools
Function Prologue & Epilogue
Prologue
- call func =
push %next-rip;
jmp func
mov $eax,0
push func
allcation in RAM- %rip -> func : push rbp
%save-rbp
- mov $rbp, $rsp
- sub %rsp,0x70 0x70 #compiler 決定 >> To store local variable
- Prologue finish
Epilogue
- leave =
mov %rsp,%rbp;
pop %rbp;
pop %rbp
-> get%saved-rbp
segment.- ret =
pop $rip
- %rip Back to
%next-rip
- Epilogue finish
Buffer Overflow
Hijack return address , control rip.
bof.c
1 |
|
- 輸入超過 0x18 bit,將覆蓋堆疊中 main function 的 return address。
- 當返回時,將堆疊的值放入 rip -> Illegal virtual addr
- 引發 segmentation fault -> 堆疊崩潰
蓋
0x10 bit
會到 rbp 所以要加 8 bit覆蓋rbp 之後才填入要去的address (使用pwntools p64())
gets(buf)
: danger function
Linux SysCall
和 kernal 溝通的
interface
- instruction -syscall
- $rax -Syscall_number
- Arguments -
(rdi, rsi, rdx, r10, r8 ,r9)
- return value - $rax
Ex: read(0,buf,0x100)
1 | xor rdi, rdi ; 將 rdi 寄存器清零,用作文件描述符 |
ShellCode
- input shellcode (Syscall)
- overflow to the address of shellcode
docker-compose
1 | $cd prectice |
- Title: NTTU CSclube pwn part 1.
- Author: Chihhh Linnn
- Created at : 2024-05-09 16:21:46
- Updated at : 2024-05-09 16:21:46
- Link: https://chihhhs.github.io/2024/05/09/nttu-csclub-pwn/
- License: This work is licensed under CC BY-NC-SA 4.0.