일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- System
- LoB
- 파이썬
- windosws wbcs
- OSI
- SWiFT
- web
- windosw 문자열
- level13
- C
- 백준
- PHP
- HTML
- 두근두근 자료구조
- ftz level13
- 암호수학
- 파일 시스템
- 큐
- Stack
- War Game
- 재귀
- c언어
- 자료구조
- ftz
- 정렬 알고리즘
- 스택
- 시간복잡도
- pwnable.kr
- Java
- 미로 탐색 알고리즘
- Today
- Total
목록War Game/pwnable.kr (6)
나의 기록, 현진록
pwnable.kr random rand() 함수는 항상 고정된 값이다. rand() 함수 실행 시 rax 레지스터를 확인한다. rax 값은 0x6b8b4567 0xdeadbeef와 xor 연산 b526fb88를 10진수로 바꾸어 입력한다.
pwnable.krpasscode main 함수에서는 welcome()login()순으로 함수를 호출한다. welcome() char[100]의 name 배열에 %100s 때문에 100칸만 입력 받을 수 있다. -0x70이 name 주소이다. login()에서 scanf()를 보자. scanf("%d", passcode); &passcode가 아니다. 즉 passcode의 값인 주소에 입력 받는 것이다. -0x10가 passcode1 주소이다. name부터 passcode1 까지의 거리는 0x60이고, 10진수로는 96이다. name에 100칸을 입력 받을 수 있고 100-96인 4byte를 덮을 수 있다. 4byte는 주소를 입력하기 좋은 크기이다. 아마도 주소 입력을 요구하는 것 같다. 마침 logi..
pwnable.krbof func 함수 실행 deadbeef 인자로 인해 key가 초기화되어 있다. overflowme 배열에 gets 입력 key == cafebabe 와 같으면 /bin/sh 실행 func+40 : ebp+8과 cafebabe를 비교한다. func+29 : 현재 ebp는 ebp-2c ebp-2c에서 ebp+8까지의 거리는 52 52바이트부터 cafebabe를 입력한다.
pwnable.kr collision hashcode 와 check_pass의 리턴 값이 같아야 한다. check_pass 함수는 문자열을 인자로 받아 정수형으로 캐스팅 후 4바이트씩 5번 더한 값을 res에 저장 후 리턴한다. 21DD09EC / 5 = 6C5CEC8 6C5CEC8 * 5 = 21DD09E8 21DD09EC와 21DD09E8는 서로 다르다. 4byte가 작기 때문에 6C5CEC8을 4번 더한 후 6C5CECC를 더해주면 된다.
pwnable.krfd .a를 인자로 하여 실행 했더니 리눅스 파일 입출력에 대해 공부하라고 반응하였다. 코드 분석 atoi 함수는 문자열을 정수로 변환하는 함수이다. 아스키코드 값을 이용한다. fd에는 인자로 받은 문자열을 정수로 바꾸어 0x1234 만큼 뺀으로 초기화된다. 0x1234는 16진수로서 10진수로 바꾸면 4660이다. 다음은 read 함수이다. read(int fd, void *buf, size) fd는 파일 디스크립터 *buf는 read할 버퍼이다. size는 얼마만큼 읽은 것인지에 대한 크기이다. fd 파일 디스크립터란 파일을 관리하기 위해 운영체제가 요구하는 정보이다. 리눅스의 경우 파일 디스크립터는 다음과 같다. 0인 경우 : 표준 입력1인 경우 표준 출력2인 경우 표준 에러 이와..