#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buf[32];
int main(int argc, char* argv[], char* envp[]){
if(argc<2){
printf("pass argv[1] a number\n");
return 0;
}
int fd = atoi( argv[1] ) - 0x1234;
int len = 0;
len = read(fd, buf, 32);
if(!strcmp("LETMEWIN\n", buf)){
printf("good job :)\n");
system("/bin/cat flag");
exit(0);
}
printf("learn about Linux file IO\n");
return 0;
}
FC 하다가 너무 오래 끌어서 pwnable.kr을 먼저 시작하기로 함
원래 FC를 다 풀고 넘어오려고 했지만, 뒷 문제 답도 안 나오는 수준인데, 혼자서 그거 다 풀면 너무 일취월장 ㅋ
어쨌든 pwnable.kr 첫 문제 입성은 우선 기분이 좋다 금방 풀었으니까.
맨 처음에 main 함수의 envp 인자를 받고 있는 걸 처음봐서(? 아마 기억 못하는 거겠지만) 검색을 해봤는데,
환경 변수등이 실행 중인 프로세스가 그대로 받아서 쓰는 게 아니라 위의 형식처럼 원래부터 인자로 넘겨 받아서 새로 메모리에 올리고 사용하는 형식이란 점을 배웠다.
그래서 저렇게 인자로 받은 이후에 setenv(), unsetenv() 등으로 환경변수를 설정 / 해제 하더라도 실제 환경변수는 변하지 않는다더라.
그래서 원래 buf라는 이름의 환경변수를 만들고 해당 값에 LETMEWIN\n 이라는 문자열을 넣는 건가했는데 그건 아닌 것 같고 (전역변수에 덮여쓰여질지도 확실치 않고, 좀 잘못된 접근 같음)
결국 그냥 read 함수에서 fd(보통 file descriptor의 약자로 씀)를 어떻게 조절해서 내가 원하는 입력값을 넘겨줄 것인가의 문제였다.
그래서 힌트도 file IO 얘기가 있었고...
뭐 하여간, 표준 입출력 관련해서 0이 표준입력 (키보드), 1이 표준 출력(모니터) 2가 표준 에러 출력이니까
위에 atoi로 계산한 후 fd값을 0으로 만들면 그 뒤에 read함수가 호출될 때 커서를 통해서 값을 입력받고
그 때 그냥 LETMEWIN\n이라고 치면 됨 ㅇㅇ
'Pwnable.kr' 카테고리의 다른 글
Pwnable.kr [input] (0) | 2019.04.30 |
---|---|
Pwnable.kr [random] (0) | 2019.04.29 |
Pwanble.kr [passcode] (0) | 2019.04.29 |
Pwnable.kr [bof] (0) | 2019.04.24 |
Pwnable.kr [collision] (0) | 2019.04.24 |