위는 pwnable.kr 에서 받은 fd 문제이다.
따로 바이너리를 주지 않았던 문제였다. 사실 포너블 문제인데 바이너리를 받지 않았던적이 처음이라 시작부터 당황은 했지만 여기서 준 ssh 접속 정보를 통해서 접속부터 해봤다.
ssh 접속을 하니 문제 바이너리, 소스코드, flag 파일이 있었다. flag 파일은 권한이 안된다고 떠서 바이너리를 이용해야 한다는 생각이 들었고 소스코드를 한번 읽어보았다.
#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;
}
위는 문제 파일이다.
코드를 해석해보면 바이너리를 실행하면 바이너리를 실행하면서 넣는 인자에 0x1234를 뺀 값을 fd로 설정을 하고 read함수에 fd 값을 첫번째 인자로 전달하고 buf에 값을 받는다. 그리고 LETMEWIN 이라는 문자열과 비교를 하여 맞으면 system 함수를 통하여 flag 값을 출력해주는 파일이다.
그렇다면 익스 과정은 다음과 같다.
- fd 함수를 실행할 때 인자로 4660(0x1234)를 같이 전달하면서 실행한다.
- 실행이 되면 LETMEWIN을 입력해준다.
- flag가 출력된다.
flag 값을 얻었다.
(드림핵만 해서 그런지 flag 형식이 이상해서 저게 flag인지도 모르고 뭐가 문젠지 몰라서 계속 헤맸다;;)
'Write Up > pwnable.kr' 카테고리의 다른 글
bof - pwnable.kr (0) | 2023.07.03 |
---|---|
collision - pwnable.kr (1) | 2023.07.03 |