[pwnable.kr] mistake - 1 pt
이번에 풀어볼 문제는 이 놈이다.
mistake!!
문제를 한번 살펴보자, 대충 요약, 의역해보면
우리는 모두 실수를 저질렀다. (복잡한 기술은 필요없음) 실제 사건에 기반한 문제다. 힌트 : 연산자 우선순위 |
라는 것같다. 일단 접속해보자.
password와 flag가 보이고, 둘다 지금 접속된 계정의 권한으로는 볼 수 가 없다.
볼 수 있는 것으로는 mistake.c 와 실행할 수있는 mistake가 있다.
일단 mistake.c의 내용은 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <stdio.h> #include <fcntl.h> #define PW_LEN 10 #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i<len; i++){ s[i] ^= XORKEY; } } int main(int argc, char* argv[]){ int fd; if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){ printf("can't open password %d\n", fd); return 0; } printf("do not bruteforce...\n"); sleep(time(0)%20); char pw_buf[PW_LEN+1]; int len; if(!(len=read(fd,pw_buf,PW_LEN) > 0)){ printf("read error\n"); close(fd); return 0; } char pw_buf2[PW_LEN+1]; printf("input password : "); scanf("%10s", pw_buf2); // xor your input xor(pw_buf2, 10); if(!strncmp(pw_buf, pw_buf2, PW_LEN)){ printf("Password OK\n"); system("/bin/cat flag\n"); } else{ printf("Wrong Password\n"); } close(fd); return 0; } | cs |
프로그램은 코드만 대충 봣을때는
password에서 10자 읽어와 pw_buf에 저장하고, 0~20초 정도 대기후
사용자로부터 문자열을 받아 pw_buf2에 저장하고, 문자열 전체에 xor 0x1 을 수행한 후
strncmp로 pw_buf와 pw_buf2가 같다면 flag를 출력해주는 방식이다.
그냥 겉으로봤을 때는 위와 같은 흐름대로 프로그램이 실행될것으로 보이나... 아니였다.
힌트가 연산자 우선순위인데(처음에는 strncmp 부분에서 무언가 있는가 해서 시간날때마다 살펴보았으나, 결국 삽질만 한것이였다.)
프로그램이 실행되고 초기에 if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)을 수행하는데
여기서 연산의 우선순위가 '='연산자보다 '<'연산자가 높기때문에 fd=(open("~",O,0400) < 0)같이 된다. 즉 open(~,~,~)<0이 먼저 수행되어 false(0)라는 결과가 나와 fd=0이 된다.
그래서 결국 sleep(time(0)%20); 후에 아래 if문의 read를 만나게되고 read(fd,pw_buf, pw_LEN)에서 fd가 0이므로 stdin으로 입력을 받아 pw_buf에 저장되게 된다. 이것이 뜻하는 것은 sleep()로 대기한 후 우리가 pw_buf값을 임의로 입력할 수 있다는 것이다.
pw_buf의 값과 pw_buf2의 값 모두 입력할 수 있고, pw_buf2는 xor 0x1를 수행한 후 pw_buf와 비교하게 되니,
XOR연산의 특성상 pw_buf2 XOR 0x1 한 값을 pw_buf로 넣으면 XOR 0x1을 수행하면 0x1이 소거되어 둘이 같은 값이 될 것이다.
pw_buf2의 값으로 AAAAAAAAAA을 넣는다고 하면 pw_buf에는 "A" XOR 0x1한 @@@@@@@@@@@을 넣으면 될 것이다.
이제 한번 넣어보자.
와우...!! 풀었다! 잘했다 굿....!!
Mommy, the operator priority always confuses me :(
'Wargame > Pwnable.kr' 카테고리의 다른 글
[pwnable.kr] blackjack - 1 pt (0) | 2018.05.01 |
---|---|
[pwnable.kr] cmd1 - 1 pt (0) | 2018.05.01 |
[pwnable.kr] shellshock - 1 pt (0) | 2018.05.01 |
[pwnable.kr] random - 1 pt [Toddler's Bottle] (0) | 2018.04.25 |
[pwnable.kr] fd - 1 pt [Toddler's Bottle] (0) | 2018.04.24 |