tmxklab
[pwnable.kr] mistake 본문
1. 문제 확인
mistake@pwnable:~$ ls -l
total 24
-r-------- 1 mistake_pwn root 51 Jul 29 2014 flag
-r-sr-x--- 1 mistake_pwn mistake 8934 Aug 1 2014 mistake
-rw-r--r-- 1 root root 792 Aug 1 2014 mistake.c
-r-------- 1 mistake_pwn root 10 Jul 29 2014 password
[ mistake.c ]
#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;
}
pwn_buf에는 "/home/mistake/password" 파일의 10byte가 저장되어 있고 pwn_buf2에는 10byte만큼 사용자 입력을 받고 xor()에서 xor을 진행한 결과 값이 저장되어 있다.
최종적으로 pwn_buf와 pwn_buf2의 10byte를 비교했을 때 같아야 플래그 값을 확인할 수 있다. password는 권한이 없어서 내용을 확인할 수 없다.
2. 접근 방법
서버 느려서 걍 로컬에서 mistake.c 컴파일해서 확인
근데 한 번만 입력받아야 되는데(pwn_buf2) 2번 입력을 받을 수 있다(?)
확인해보니 파일을 성공적으로 열면 eax에 3으로 세팅되는데 open호출 다음 어셈블리어 shr eax, 0x1f를 실행하고 eax에 0으로 세팅된다. eax는 fd값으로 다음 read함수에서 사용된다.
if(!(len=read(fd,pw_buf,PW_LEN) > 0)){
printf("read error\n");
close(fd);
return 0;
}
위 if문에서 연산자 우선순위에 의해 read의 리턴 값()을 len에 먼저 저장하는 것이 아니라 "> 0"
즉 shift연산을 진행하기 때문
따라서, 입력을 2번 받을 수 있고 사용자가 알아서 pwn_buf랑 pwn_buf2의 10byte 입력 값을 동일하게 맞추면 된다.
xor()에서 pwn_buf2는 10byte만큼의 원소들을 모두 1씩 xor연산하니깐 pwn_buf보다 1만큼 작으면 됨
3. 문제 풀이
pwn_buf 입력 : cccccccccc(0x63636363...)
pwn_buf2 입력 : bbbbbbbbbb(0x6262626...)
4. 몰랐던 개념
'War Game > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] coin1 (0) | 2020.12.02 |
---|---|
[pwnable.kr] shellshock (0) | 2020.11.20 |
[pwnable.kr] leg (0) | 2020.11.20 |
[pwnable.kr] input (0) | 2020.11.20 |
[pwnable.kr] random (0) | 2020.11.20 |
Comments