일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- LoB
- pwnable.kr
- 자료구조
- windosw 문자열
- ftz level13
- 백준
- C
- web
- OSI
- War Game
- windosws wbcs
- 두근두근 자료구조
- 파이썬
- Stack
- c언어
- 큐
- 재귀
- HTML
- 파일 시스템
- 정렬 알고리즘
- PHP
- 암호수학
- ftz
- Java
- System
- 미로 탐색 알고리즘
- 시간복잡도
- SWiFT
- level13
- 스택
- Today
- Total
목록War Game/LOB (18)
나의 기록, 현진록
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 주소
LOB golem problem_child() 함수에서 40 크기의 buffer에 41만큼 복사한다. 1btye의 버퍼 오버플로우가 발생한다. 41byte은 SFP 영역이다. 위에 FPO라고 쓰여있는 게 보인다. Frame Point Overflow SFP 변조를 통해 버퍼 오버플로우 기법을 활용하는 문제이다. 40btye 이후에 1byte 만큼의 SFP를 변조할 수 있다. SFP 값이 변조되면 ret 값 또한 변조된다. 페이로드는 아래와 같이 구성될 것이다. [NOP] [SHELLCODE] [1byte]|--------40byte-----| |1byte| 그렇다면 SFP 값에 덮어야할 주소는 무엇일까? 어쨌든 최종적으로 쉘코드가 있는 buffer에 접근해야할 것이다. gdb로 분석을 해보자. main+..
LOB skeleton buffer로부터 +44~48 byte 바이트를 제외하고 모두 0으로 초기화된다. ret이후부터 0xbfffffff까지의 영역은 ret부터 커널 전까지의 영역을 말한다. 어디 영역을 사용해야 하는 것일까? 공부할 때 모르는 부분이 있을 때는 답안을 보고 공부를 하는 것도 한가지 방법이라고 생각한다. 다른 블로그를 보고 공유 라이브러리를 이용하는 문제라는 것을 알게 되었다. 다음은 메모리의 구조이다. [kernel] [program name] [env] [argv] -중략- [buf] [ret] [공유 라이브러리] [heap] [data] 커널 이후부터 (0xbfffffff) ret까지 초기화 된다면 공유 라이브러리는 초기화 되지 않을 것이다. 프로그램을 시작할 때 공유 라이브러리가..
LOB vampire 다음은 skeleton의 소스 내용이다. 버퍼, 환경변수, argv 영역 모두 사용할 수 없다. 어떤 영역을 사용해야 할까? 먼저 원본 파일을 복사하고 스택이 초기화되지 않은 영역을 찾아보자. 프로그램이 종료되기 전 브레이크 포인트 설정 스택이 끝나기 전 초기화되지 않는 부분을 볼 수 있다. 파일 이름이 스택에 저장된 것이 확인 되었다. 실제로 stack layout은 이렇게 구성된다. 프로그램의 이름이 맨 끝에 초기화되지 않고 저장된다. 파일 이름을 쉘코드로 한 후 파일 이름의 주소를 ret 주소에 덮어준다. 앞 뒤에 안전하게 NOP을 적정량 입력해준다. 세그먼트 오류로 ret 값에 들어갈 주소가 잘못 되었는 것을 알 수 있다. 0xbfffff35가 정확한 주소이다. 성공 복사한 ..
LOB troll 기존의 조건이 많이 사라졌다. 그러나 \xbfff****영역을 사용하지 못한다. 스택이 쌓여지는 초기 영역을 사용하지 못한다면 스택을 한참 쌓아올리고 \xbfff 영역을 벗어난 후의 영역을 사용해야 한다. 스택의 특징을 이용하면 될 것 같다. 쌓여질 수록 주소가 점점 낮아지는 스택은 데이터를 많이 넣으면 낮은 주소의 영역을 접근한다. 일단 쉘코드를 넣을 주소를 알아보자. 원본 파일을 복사한 후에 gdb 실행 먼저 NOP을 1만개 입력하면 스택은 esp는 어디까지 접근할 수 있을까 아직 \xbfff 영역이다. 10만개의 NOP 입력 esp가 \xbfff 영역을 벗어났다. NOP은 \xbffe75d9 영역부터 채워진다.이 위치가 argv[1]이다. argv[1]에 쉘코드를 넣어보자. 성공 ..