Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- UNIQUE constraint failed
- 백준
- 나이순 정렬
- 액션바 필요없숴
- cmd1
- 10814
- 페니빙
- SQLiteConstraintException
- pwable.kr
- Docker
- 클라우드가 뭐야
- java.lang.IllegalStateException
- 블록체인
- pwnable
- 쏘큩
- Couldn't read row 0
- Drive-By-Download
- 6566
- 코틀린
- 클라우드란?
- 애너그램 그룹
- 포너블
- python
- 파이썬
- pwnable.kr
- col -1 from CursorWindow
- kotlin
- Make sure the Cursor is initialized correctly before accessing data for it.
- cmd2
- tlqkf
Archives
- Today
- Total
푸르미르
pwnable.kr 7. input 본문
cat input.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main(int argc, char* argv[], char* envp[]){
printf("Welcome to pwnable.kr\n");
printf("Let's see if you know how to give input to program\n");
printf("Just give me correct inputs then you will get the flag :)\n");
// argv
if(argc != 100) return 0;
if(strcmp(argv['A'],"\x00")) return 0;
if(strcmp(argv['B'],"\x20\x0a\x0d")) return 0;
printf("Stage 1 clear!\n");
// stdio
char buf[4];
read(0, buf, 4);
if(memcmp(buf, "\x00\x0a\x00\xff", 4)) return 0;
read(2, buf, 4);
if(memcmp(buf, "\x00\x0a\x02\xff", 4)) return 0;
printf("Stage 2 clear!\n");
// env
if(strcmp("\xca\xfe\xba\xbe", getenv("\xde\xad\xbe\xef"))) return 0;
printf("Stage 3 clear!\n");
// file
FILE* fp = fopen("\x0a", "r");
if(!fp) return 0;
if( fread(buf, 4, 1, fp)!=1 ) return 0;
if( memcmp(buf, "\x00\x00\x00\x00", 4) ) return 0;
fclose(fp);
printf("Stage 4 clear!\n");
// network
int sd, cd;
struct sockaddr_in saddr, caddr;
sd = socket(AF_INET, SOCK_STREAM, 0);
if(sd == -1){
printf("socket error, tell admin\n");
return 0;
}
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = INADDR_ANY;
saddr.sin_port = htons( atoi(argv['C']) );
if(bind(sd, (struct sockaddr*)&saddr, sizeof(saddr)) < 0){
printf("bind error, use another port\n");
return 1;
}
listen(sd, 1);
int c = sizeof(struct sockaddr_in);
cd = accept(sd, (struct sockaddr *)&caddr, (socklen_t*)&c);
if(cd < 0){
printf("accept error, tell admin\n");
return 0;
}
if( recv(cd, buf, 4, 0) != 4 ) return 0;
if(memcmp(buf, "\xde\xad\xbe\xef", 4)) return 0;
printf("Stage 5 clear!\n");
// here's your flag
system("/bin/cat flag");
return 0;
}
|
cs |
;;;
argv 파트
argv['A'], argv['B'], argc가 100이 되도록 만든다.
argc는 실행시 전달된 인자의 개수를 의미하고, argv는 그 인자를 말한다.
fd(file descriptor)가 0이면 stdin이므로 콘솔 입력으로 "\x00\x0a\x00\xff"를 입력받고,
fd가 2이면 stderr로 "\x00\x0a\x02\xff"를 받아야 한다.
getenv는 환경변수의 주소를 출력해준다. 그런데 여기서 "\xde\xad\xbe\xef"를
"\xca\xfe\xba\xbe" 로 입력해주면 된다.
파일을 연 후에, 처음 4바이트가 "\x00\x00\x00\x00" 이면 된다.
'SECURITY > pwnable' 카테고리의 다른 글
pwnable.kr 9. mistake (0) | 2021.04.28 |
---|---|
pwnable.kr 8. leg (0) | 2021.04.28 |
pwnable.kr 6.random (0) | 2021.04.06 |
pwnable.kr 5.passcode (문제 파악) (0) | 2021.03.31 |
pwnable.kr 4.flag (0) | 2021.03.31 |