일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 두근두근 자료구조
- HTML
- windosws wbcs
- level13
- War Game
- 큐
- 재귀
- web
- SWiFT
- OSI
- pwnable.kr
- 암호수학
- PHP
- 파일 시스템
- 정렬 알고리즘
- 시간복잡도
- LoB
- Stack
- 자료구조
- 미로 탐색 알고리즘
- windosw 문자열
- ftz
- c언어
- Java
- C
- 파이썬
- System
- 스택
- 백준
- ftz level13
- Today
- Total
목록War Game (41)
나의 기록, 현진록
pwnable.kr random rand() 함수는 항상 고정된 값이다. rand() 함수 실행 시 rax 레지스터를 확인한다. rax 값은 0x6b8b4567 0xdeadbeef와 xor 연산 b526fb88를 10진수로 바꾸어 입력한다.
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인 경우 표준 에러 이와..
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 함수를 이용할 수도 있다.
LOB bugbear execve의 주소와 argv[44]의 입력된 값이 같아야한다. execve함수를 이용한 RTL 기법을 사용해보자. 다음은 execve 함수의 간단한 설명이다. 설명 execve 함수는 새로운 프로그램을 실행시킴과 동시에 현재 프로그램을 종료한다. 사용법 execve (const char *filename, char *const argv [], char *const envp[]); 1. filename이 가리키는 파일을 실행한다. 2. argv는 새로 시작할 프로그램에 전달될 인자이다. 3. 설정된 환경변수를 사용한다. 페이로드는 1. main ret 값에 execve 주소를 덮어 함수를 실행한다, 2. execve 함수의 첫번째인자가 실행되고 exit 함수로 인해 바로 종료된다. ..
LOB darkknight 힌트는 RTL return to library 공유 라이브러리 영역을 이용하는 것이다. system 함수를 활용하기 위해 system 함수의 주소를 알아보자. system 함수의 주소는 0x40058ae0 /bin/sh의 주소를 알아내기 위한 코드 작성 /bin/sh의 주소는 0x400fbff9 system 함수의 인자 처리방식은 ebp+8 주소에 있는 인자를 가져온다. 페이로드 작성 ret값에 system 함수의 주소 AAAA (ebp+4) ebp+8에 /bin/sh 주소