[35C3 CTF][Pwn] 1996
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <unistd.h> #include <stdlib.h>
using namespace std;
void spawn_shell() { char* args[] = {(char*)"/bin/bash", NULL}; execve("/bin/bash", args, NULL); }
int main() { char buf[1024];
cout << "Which environment variable do you want to read? "; cin >> buf;
cout << buf << "=" << getenv(buf) << endl; } |
Spawn_shell함수는 있지만 main함수에는 안 쓰여서 의심이 갔습니다.
gdb를 이용해서 분석을 해보겠습니다.
소스코드 에서는 buf를 1024만큼의 크기를 줬는데 gdb로 확인해본 결과 0x408 = 1032만큼의 크기가 주어져 있습니다.
그렇다면 다음과 같이 이루어져 있는 것 같습니다.
buf[1024] + dummy[8] + SFP[8] + RET[8] 로 되어 있는 것 같습니다.
총 1024+8+8+8=1048 만큼 무작위로 입력을 해준 뒤에 main함수에 없엇던 spawn_shell함수를 호출해서 확인해 보도록 하겠습니다.
Spawn_shell 함수의 첫 시작 주소는 400897입니다.
Flag.txt 파일을 확인했더니 flag값이 나왔습니다.
Flag : 35C3_B29A2800780D85CFC346CE5D64F52E59C8D12C14