본문 바로가기

Pwnable.kr

Pwnable.kr [fd]

#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