LOB orge Write-Up

2019. 7. 31. 00:40
728x90
728x90
728x90

LOB orge 풀어보자.

 

[사진 1]

주어진 코드를 보면 argc가 2개가 아니면 종료한다. 즉 두 번째 인자를 사용할 수 없다. 게다가 첫 번재 인자의 길이를 검사하기 때문에 첫 번째 인자도 사용할 수 없다. 남은 것은 파일명 argv[0]인데 이 곳에 shellcode를 입력하고 ret를 argv[0]의 주소로 변조해야 한다. 파일명에 shellcode를 이용하기 위한 방법으로 심볼릭 링크로 shellcode를 파일명으로 하는 링크 파일을 생성하여 원본파일을 실행하는 것이다. 여기서 파일명에 "\x2f" 값이 들어가면 디렉터리로 인식하기 때문에 "\x2f" 값이 없는 shellcode를 사용해야 한다.

 

 

[사진 2]

위와 같이 두 번째 인자를 전달하면 종료된다.

 

 

[사진 3]
[사진 4]

main 함수의 어셈블리어 코드를 보면 strcpy 함수를 호출하기 전에 ebp-0x28 주소를 eax 레지스터에 저장한다. 즉, 이 곳이 buffer 변수의 시작점이다.

 

 

[사진 5]

따라서 스택은 위와 같이 형성될 것이고, strcpy 함수로 argv[1] 값을 buffer 변수로 복사하므로 44bytes를 입력하면 ebp까지 변조할 수 있다.

 

 

[사진 6]

먼저 디버깅하기 위해 troll 파일을 다른 이름(kroll)으로 복사해주었다. 그리고 심볼릭 링크로 kroll 파일을 링크하고 shellcode를 파일명으로 갖는 링크 파일을 생성하였다. 위와 같이 파일명인 argv[0] 값이 주소 0xbffffbf4부터 저장되는 것을 확인할 수 있다.

 

[사진 7]

[사진 6]에서 확인한 argv[0] 주소로 ret를 변조하면 세그멘테이션 오류가 발생하고 core 파일이 생성되는데 해당 core파일을 gdb로 확인해보면 실제로 argv[0]이 저장되는 주소가 0xbffffbc4인 것을 확인할 수 있다. 이렇게 주소가 차이나는 이유는 gdb를 통해 실행하면 gdb 환경변수 등과 같은 이유로 실제 주소와 차이가 나기 때문이다.

 

 

[사진 8]

따라서 실제 주소로 변경하면 orge 계정의 password를 확인할 수 있다. 링크 파일을 삭제한 후 troll 파일을 링크하고 파일명으로 shellcode를 갖는 링크 파일을 생성한다. 사용한 shellcode는 다음과 같다.

\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81

shellcode 앞에 nop(\x90)를 6bytes 입력해주었는데, 이는 명령어를 구분해주기 위함이다.

그리고 다시 페이로드를 작성하면 위와 같이 troll 계정의 password를 확인할 수 있다.

728x90
728x90

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

LOB vampire Write-Up  (0) 2019.07.31
LOB troll Write-Up  (0) 2019.07.31
LOB darkelf Write-UP  (0) 2019.07.30
LOB wolfman Write-Up  (0) 2019.07.30
LOB orc Write-Up  (0) 2019.07.30

+ Recent posts