일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Stack
- ftz
- System
- level13
- C
- windosw 문자열
- OSI
- ftz level13
- pwnable.kr
- 두근두근 자료구조
- PHP
- 스택
- 암호수학
- c언어
- 자료구조
- 미로 탐색 알고리즘
- 정렬 알고리즘
- 백준
- web
- 파이썬
- War Game
- LoB
- 시간복잡도
- HTML
- 재귀
- 큐
- SWiFT
- 파일 시스템
- Java
- windosws wbcs
- Today
- Total
목록War Game (43)
나의 기록, 현진록
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인 경우 표준 에러 이와..
pwnable.kr 접속하기 pwnable.kr 검색 후 이동 좌측 상단 Play 클릭 첫번째 문제인 fd 클릭 fd 문제에 접속하기 위한 정보 프로토콜 : ssh ID : fd 호스트 : pwnable.kr 포트 2222 아래와 같은 방법으로 접속
LOB nightmare fgets 함수의 인자인 stdin 버퍼를 이용한다. ret 주소에 2byte는 \x90\x90이어야만 한다. stdin 버퍼 확인 fgets 함수가 끝난 main+26에 breakpoint 설정 AAAAAAAA 입력 후 stdin 확인 전과 다르게 주소가 저장되어 있다. 0x40015000 주소에 입력한 AAAAAAAA가 저장되어 있다. 이 주소에 쉘코드를 넣는다. 페이로드 작성 [ \x90\x90 2byte] [ shellcode 25byte ] [ \x90*17 17byte ] [ \x40015001 ] \x40015002도 된다.
LOB zombie_assassin 요약하면 다음과 같다. 공유라이브러리를 사용할 수 없다. ret 주소는 반드시 DO함수의 주소를 가진다. buffer 변수의 값을 모두 0으로 바꾼다. ret 주소 + 100byte 이후의 모든 주소를 0으로 바꾼다. LD_PRELOAD 방지. 최종적으로 check 변수의 저장된 값이 4가 되어야 system 함수를 호출할 수 있다. 처음 ret 값에 반드시 DO 함수의 주소를 가져야하므로 DO 함수의 ret 값에 GYE 함수의 주소를 입력한다. 나머지 함수들도 연쇄적으로 ret 값에 각각의 주소를 넣는다. MO 함수에 도달하여 system 함수를 호출하면 /bin/sh를 입력한다. 먼저 각 함수의 주소를 먼저 알아보자. 각 함수의 주소를 연속으로 입력해준 다음 MO ..
LOB assassin fake ebp SFP 값을 변조하는 문제이다. 48byte까지 제한이 있기 때문에 FEBP 기법을 사용할 수 있다. ret 값에 leave를 넣는 것이다. leave는 다음과 같다. 1. mov esp ebp 2. pop ebp 1. esp에 ebp 저장하여 esp, ebp 모두 SFP 값을 가리킨다. 2. pop에 의해 ebp+4 ret은 다음과 같다. 1. mov eip 2. jmp eip ret에는 leave 주소를 넣어줄 것이기 때문에 다시 leave가 실행된다. pop에 의해 ebp는 ebp+4가 저장되어 있고 leave의 mov esp ebp로 인해 esp에는 ebp+4가 저장된다. 그리고 ret에 의해 ebp+4로 이동한다. ebp+4에 buffer 주소를 넣고 bu..
LOB giant ret에 들어갈 최상위 비트가 \xbf 또는 \x40이 될 수 없다. 이 두 조건 이외의 ret에 관련된 다른 조건이 없으므로 이 부분만 우회하면 된다. ret 주소에 ret 주소를 넣어주면 우회할 수 있다. 그러면 그냥 ret을 한번 더 실행한다. 그리고 argv[] 영역을 이용해 쉘코드 넣어주자. 페이로드는 이렇게 구성될 것이다. [ ebp+44 ] [ ret ] [ ret ] [ argv[2] ] [ shellcode ] ret 값에 ret이 시작되는 주소를 넣으면 또 ret이 실행되고 그 다음 주소로 리턴된다. 여기서 그 다음 주소는 argv[2]이다. 다음은 ret 주소이다. argv[2]의 주소 오류 성공 페이로드 작성 system 함수를 이용할 수도 있다.