일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 완전탐색
- 컴공복전
- exec
- higunnew
- paging
- BOJ
- Brute Force
- 구현
- 알고리즘
- dfs
- 동기화문제
- segmentation
- 백준
- 삼성리서치
- 삼성기출
- 스케줄링
- 가상메모리
- fork
- 프로세스
- 백트래킹
- 김건우
- 데드락
- ascii_easy
- samsung research
- BFS
- pwnable.kr
- 운영체제
- 시뮬레이션
- Memory Management
- Deadlock
- Today
- Total
gunnew의 잡설
pwnable.kr 9. mistake (Operator priority) 본문
이번 것은 굉장히 쉬웠다. 그러나 이전에 트라우마(?)가 있어 gdb로 뜯어보다가 시간만 날렸다. 결론부터 말하면 그냥 C파일만 봐도 된다. 왜냐하면 힌트에 operator priority가 쓰여있기 때문.
소스 코드를 통한 풀이 |
#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");
1,1 Top
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
printf("can't open password %d\n", fd);
return 0;
}
여기서 fd에 open이 들어가는 것이 아니라 open( ~~ ) < 0이 우선 순위가 높기 때문에 이것이 먼저 연산된다. open이 정상적으로 되기 때문에 이 값은 false가 되고 fd에는 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;
}
방금 fd = 0이라는 것을 알 수 있었다. read(fd, pw_buf, PW_LEN)에서 fd가 0이므로 표준 입력을 통해 pw_buf에 값을 입력할 수 있다. 여기서 간단하게 0000000000 (0은 0x30)을 대입하자. 그 이유는 차후 설명
char pw_buf2[PW_LEN+1];
printf("input password : ");
scanf("%10s", pw_buf2);
// xor your input
xor(pw_buf2, 10);
이제 우리는 pw_buf2에 길이 10인 string을 입력할 것이다. 그리고 이 문자열에
#define XORKEY인 1을 전부 XOR 해 줄 것이다.
자 근데 1은 0x01이다. 따라서 pw_buf에는 0x30이 10개 있고, pw_buf2에는 어떤 값에다가 0x01을 XOR 한 값이 들어가 있을 것이다. 이 둘이 같으려면 처음에 pw_buf2에 뭐가 들어가야 할까?
당연히 0x31이 들어가야 할 것이다. 0x31과 0x01을 XOR하면 0x30이 나오기 때문이다. 이러한 이유로 pw_buf에 0000000000을 대입한 것이다. 짝수 값이 들어가 있어야 편하기 때문이다.
따라서 pw_buf2에는 1111111111이 들어가면 될 것이다.
끝.
'System Security' 카테고리의 다른 글
pwnable.kr 11. coin1 (0) | 2020.02.16 |
---|---|
pwnable.kr 10. shellshock (0) | 2020.02.14 |
pwnable.kr 8. leg (ARM Assembly) (0) | 2020.02.12 |
pwnable.kr 7. input (Various I/O in Linux) (0) | 2020.02.06 |
pwnable.kr 6. random (0) | 2020.02.05 |