아....64bit rop는 거의 처음이였는데 삽질만 100만번 한 것 같다....

우선 짱짱 아이다로 문제를 열어보면 사용할 수 있는 함수가 puts, read함수 두개이다.  (32bit rop에서 wirte함수로만 풀어봐서 puts는 처음이라 당황했다.)

 

조사해보니 64bit rop는 인자를 받는 피연산자가 굉장히 중요하다더라. 인자 받는 순서는 rdi, rsi, rdx순서이다.

그럼 우선 rop를 하기위해 gadget를 찾아보자.

이런식으로 ROPgadget 명령어를 입력하면 찾을 수 있다.

pead를 이용해서도 찾을 수 있다. gadget을 확인해보니 'pop rdx'가 없어서 libc에서 찾아보도록했다. 

rp를 이용해서 찾으면 저런식으로 libc에서 해당 gadget의 offset을 구할 수 있다. 나중에 libc base를 leak해서 더해주면 사용할 수 있다.(rp는 그냥 사이트에서 다운받으면 되지만, 난 mac이여서 chmod도 해줘야했다. 삽질..ㅎ)

 

이제 plt의 주소를 구해줘야 하는데 난 귀찮아서 ELF를 이용해 구했지만 직접 구할 수도 있다.

 

짱짱 아이다 functions window라던가

gdb-peda p 명령어 라던가.

 

이제 plt도 구했으니 offset을 구해보자.

우선 gdb peda에서 info proc map으로 libc base주소를 찾아주고,(b*main 같은거 하고 r 해주고 해야한다.)

이런 식으로 함수의 offset을 구해주면 기본적인 준비는 다 끝났다.

 

이제 pwntools이용해서 페이로드만 잘 써주면 되는데 여기서도 엄청나게 삽질을 했다.

우선 gadget rdx를 쓰려면 offset만 구한 것 임으로 libc base leak를 해줘야 한다. 그런데 입력은 read로 한번만 받으니 답이 안나왔다.

페이로드를 두번 보낼 수도 없고...........(?) 라고생각하면서 생각해보니 처음 페이로드로 leak을 하고, 그 뒤에 ret에 main주소를 넣어서 다시 돌아오면 두번 쓸 수 있을 것 같았다.

main주소 구해주고,

 

이런식으로 leak해줬다. 여기서도 보면 raw_input('AA')는 페이로드 중간에 멈추게 해서 다른 창으로 pid를 입력하면 디버거 할 수 있게 해줘 주소가 잘 들어갔는지 확인 할 수 있고, recv(1024)는 계속 인자를 받아봤는데 쓰레기값이 들어가는 것 같아 덮인게 잘못 들어갔나 싶어 넣어줬더니 되었다.(아직 잘 모른단 소리)

저런 식으로 libc 주소를 leak하고, read_addr에도 실 주소를 저장해서 다음 페이로드 때 system_offset에서만 더해서 계산하면 system주소를 read_got에 덮을 수 있다.

마지막으로 다시한번 페이로드를 보내면 해결 되었다.

아 추가로 삽질 한게 있는데 rdx gadget을 보면 pop rdx; pop rsi; ret이다. 따라서 인자 순서를 반대로 넣어줘야한다,...(이거로도 몇시간,,,)

 

최종 페이로드...ㅎ

'war game > game' 카테고리의 다른 글

[practice]-19950320  (0) 2019.07.28
[practice]-daRk_TempLer  (0) 2019.07.23
[practice]-rain_dROP  (0) 2019.07.23
[practice]-derby  (0) 2019.07.17
[practice]-catchme  (0) 2019.07.16

telnet으로 접속해

open -l gate [주소]를 입력해주면 된다.

'war game > LOB' 카테고리의 다른 글

LOB-level20(remote BOF)  (0) 2019.07.04
LOB-level19(fgets + destroyers)  (0) 2019.07.04
LOB-level18(plt)  (0) 2019.07.03
LOB-level17(function calls)  (0) 2019.07.03
LOB-level16(fake ebp)  (0) 2019.07.03

이번 문제는 remote bof이다. 거의 처음 접해본 문제여서 이것 저것 찾아보느라 오래걸렸다. 문제를 보면 recv에서 bof가 일어나는것을 볼 수 있다. 공격방법은 [buffer+44]+[ret]+[nop]+[shellcode]이다.

다만 서버에 ret주소를 모름으로 brute force를 사용해야한다.

맥북이 먼가 잘 안되서 워룸컴으로 진행했다.

우선 해당 터미널의 주소를 파악하고

nc로 4444포트에 접속해 놓는다.

워룸컴에는 peda가 있음으로 이용해 쉘코드를 만들고

페이로드를 작성한 뒤

실행시켜주면

아까 열어둔 포트에서 연결이 되었다고 뜬다~

 

https://d4m0n.tistory.com/93

 

[Linux/x86] Shell Reverse TCP Shellcode

Shell Reverse TCP Shellcode 이번 글에서는 Shell Reverse TCP Shellcode를 만들어 볼 것이다. Shell Reverse TCP Shellcode는 Local이 아닌 Remote 환경에서 대상 시스템의 쉘을 탈취하고자 할 때 사용된다. Rem..

d4m0n.tistory.com

TCP Shellcode 만드는 법

https://eunice513.tistory.com/275

 

[LOB] Level20: xavius → death_knight [完]

death_knight /* The Lord of the BOF : The Fellowship of the BOF - dark knight - remote BOF */ #include #include #include #include #include #i..

eunice513.tistory.com

peda로 쉘코드 만드는 법

 

https://k1rha.tistory.com/entry/Hackerschool-몽이형이-쓰신-리모트-버퍼오버플로우-총-정리remote-buffer-overflow-theory-by-mongil

 

Hackerschool 몽이형이 쓰신 리모트 버퍼오버플로우 총 정리(remote buffer overflow theory by mongil)

리모트 버퍼 오버플로우 총정리 made by Hackerschool_mongil 이번 WGD에선 데몬 형태로 작동하는 네트워크 프로그램에 대한 버퍼 오버플로우 공격 기법들에 대해 학습해 보도록 하겠다. 지금까지 우리는 로컬 영..

k1rha.tistory.com

remote bof 총정리

'war game > LOB' 카테고리의 다른 글

mac OS LOB실행  (0) 2019.07.04
LOB-level19(fgets + destroyers)  (0) 2019.07.04
LOB-level18(plt)  (0) 2019.07.03
LOB-level17(function calls)  (0) 2019.07.03
LOB-level16(fake ebp)  (0) 2019.07.03

음 해당 문제를 보니 이번에는 stack, 코드영역 둘다 ret에 못 쓰고, 심지어 library를 사용해도 leave, ret를 만나면 나가리 되는 것 같다.

library함수중 leave, ret가 없는 함수를 찾거나 해야할 텐데... 고민하던중 이번에는 이전처럼 argv로 인자를 받지도 않고, gets가 아닌 fgets로 받는 것을 볼 수 있다.

보니 stdin에 입력받아 buffer에 씌우는 것 같은데 그럼 stdin주소를 보면 넣은 인자값이 있지 않을까 생각했다.

main+6부분이 stdin부분을 받는 것 같다. bp를 걸고 확인해 보니

저렇게 들어가 있다. 아마 아직 인자를 안받아서 텅 비어있는 듯 하다.

인자를 받으니 stdin에 공간이 생겼다.

확인해보니 0x40015000에 인자를 받아준다.

그럼 쉘코드를 저곳에 넣고 ret를 저 주소로 해주면 되지 않을까..?

성공~

'war game > LOB' 카테고리의 다른 글

mac OS LOB실행  (0) 2019.07.04
LOB-level20(remote BOF)  (0) 2019.07.04
LOB-level18(plt)  (0) 2019.07.03
LOB-level17(function calls)  (0) 2019.07.03
LOB-level16(fake ebp)  (0) 2019.07.03

우선 문제를 보니 ret자리에 strcpy의 주소를 맞춰줘야하고, strcpy의 ret는 AAAA로 초기화해준다.

공격은 [system주소]+[AAAA]+[/bin/sh주소]+[nop*35]+[strcpy주소]+[AAAA]+[buf+48주소]+[buf시작주소]로 하면 될 것 같다.

 

음 실패. 역시 주소가 안맞나보다...

주소를 확인해보면 buf시작주소 = 0xbffffbb0, buf+48주소 = 0xbffffbe0이다.

가볍게 해결~

'war game > LOB' 카테고리의 다른 글

LOB-level20(remote BOF)  (0) 2019.07.04
LOB-level19(fgets + destroyers)  (0) 2019.07.04
LOB-level17(function calls)  (0) 2019.07.03
LOB-level16(fake ebp)  (0) 2019.07.03
LOB-level15(no stack, no RTL)  (0) 2019.07.02

+ Recent posts