bof

System Hacking Advanced

[dreamhack] basic_exploitation_001

문제풀이void read_flag() { system("cat /flag");}int main(int argc, char *argv[]) { char buf[0x80]; initialize(); gets(buf); return 0;}gets(buf)에서 입력 길이 검증이 없다. 따라서 BOF가 발생한다. BOF 취약점으로 RET을 read_flag() 주소로 덮으면 쉘을 얻을 수 있다. read_flag() 주소를 구해보자. gdb로 read_flag() 주소를 출력한 결과다. 0x80485b9라는 것을 확인할 수 있다. 다음으로 payload를 구성해보자. "\x90"*132 + [read_flag() 주소]RET 이전 공간을 NOP sled로 덮고 RET을 read_flag..

System Hacking Advanced

[dreamhack] basic_exploitation_000

문제분석 & 풀이int main(int argc, char *argv[]) { char buf[0x80]; initialize(); printf("buf = (%p)\n", buf); scanf("%141s", buf); return 0;}scanf("%141s", buf)를 보자. 입력 길이를 141 바이트로 제한하고 있지만 buf의 크기는 128 바이트다. 따라서 128 바이트 이상의 데이터를 입력하면 BOF(Buffer Over Flow) 취약점이 발생한다. BOF 취약점으로 RET을 조작하고 임의의 주소에 있는 코드를 실행할 수 있다. 코드에서 printf("buf = (%p)\n", buf)로 buf 주소를 출력해준다. buf에 쉘코드를 삽입하고 RET을 buf 주소로..

ftz

[ftz] level19

문제분석 & 풀이level18과는 다르게 간단한 코드 문제다. buf[20]가 선언됐고 gets()로 입력값을 받아서 buf에 저장한다. 간단하게 페이로드 구성해서 BOF하는 문제인 것 같다. 페이로드 구성을 위해 attackme를 tmp로 복사하여 GDB로 분석했다. 분석해보니 0x28(40)바이트의 공간을 할당하고 있다. [ebp-40]이 fgets()로 입력한 데이터를 저장하는 공간인 것 같다. c 코드에서는 buf가 20바이트 할당됐지만, 실제 스택에서는 40바이트의 공간이 할당됐다. 어쨌든 40바이트의 공간이 할당됐고 스택의 구조를 만들어보면 다음과 같다. buf와 SFP 사이에 20바이트 만큼의 더미가 존재한다. 페이로드를 구성해보자. (python -c 'print "A"*44+"[셸코드 주..

ftz

[ftz] level18

문제분석 & 풀이 코드가 너무 길기 때문에 핵심만 분석하겠다.  1) string[], check, x, count 등의 변수 선언 2) count가 100 이상이면 공격의심 문구를 출력check == 0xdeadbeef면 shellout()을 실행하고 level19 권한의 셸을 실행한다.  3) 사용자에게 입력값을 1바이트씩 받고 변수 x에 저장if) x의 값이 0x08이면 count--를 진행else) x의 값이 조건 이외의 값이면 string[count]에 x 값을 저장하고 count++ level19의 권한을 얻기 위해서는 check를 0xdeadbeef로 만들어야한다. 그러나 [사진]에서 알 수 있듯이 check 변수의 위치가 입력값을 저장하는 string보다 스택 하단에 위치하기 때문에 str..

ftz

[ftz] level17

문제분석 & 풀이코드 분석1. printit() : 출력문 출력2. crap, *call, buf[] 선언3. call에 printit()의 주소를 넣는다. 4. fgets()로 사용자에게 48바이트만큼 입력값을 받는다.5. setreuid()로 level18의 권한으로 변경6. call()을 실행함으로써 printit() 실행 이전 문제와 유사한 코드이다. 하지만 셸을 실행하는 함수인 shell()이 존재하지 않는다. 따라서 level16과 같은 방식으로는 문제를 해결 할 수 없다. 그렇다면 어떻게 해결 할 수 있을까? RTL 공격기법을 이용하면 해결 할 수 있다. RTL을 활용하기 위해서는 system(), "/bin/sh" 등의 주소를 구해야하는 번거로움이 있다. 더 쉽게 풀기 위해서 번거로운 작업..

ftz

[ftz] level16

문제분석 & 풀이코드 분석1. shell() : level17의 권한으로 셸 실행2. printit() : 출력문 출력3. crap, *call, buf[]를 선언했으며 call에는 printit()의 주소를 넣어주고있다.4. fgets()을 통해 48바이트만큼 사용자에게 입력값을 받는다.5. call()을 호출하여 printit()를 실행한다. call에 printit()의 주소를 저장하고 call()을 호출하여 printit()을 실행하고 있다. 그렇다면 call에 저장된 함수의 주소를 printit() → shell()로 바꿔줄 수 있다면, printit()이 아닌 shell()을 실행하여 level17의 셸을 얻어낼 수 있다. 어떻게 call에 저장된 주소값을 바꿀 수 있을까? call의 위치가 ..

keyme
'bof' 태그의 글 목록 (2 Page)