LOB wolfman Write-Up

2019. 7. 30. 22:25
728x90
728x90
728x90

LOB wolfman 풀어보자.

 

[사진 1]

이전 문제와 다른 점은 첫 번째 인자의 길이가 48bytes를 초과하면 프로그램을 종료한다. 따라서 첫 번재 인자에 shellcode를 입력하고 ret를 shellcode의 주소로 변조하는 것은 불가능하다. 하지만 argv 인자 갯수를 제한하지 않으므로 로 두 번째 인자인 argv[2]에 shellcode를 입력하고 ret를 argv[2] 주소로 변조하면 될 것 같다.

 

 

[사진 2]

위와 같이 첫 번째 전달 인자의 48번째 값을 "\xbf"로 주면 바로 죵료되지는 않지만 추가로 입력하면 프로그램이 종료된다.

 

 

[사진 3]
[사진 4]

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

 

 

[사진 5]

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

 

 

[사진 6]

디버깅하기 위해 darkelf 파일을 다른 이름(karkelf)으로 복사하였다. 그리고 함수 프롤로그를 마치는 main+3에 브레이크 포인트를 설정하고 첫 번째 인자로 임의의 값 "\x90" 44bytes와 ret를 변조할 값 "ABCD"을 입력하고 두 번째 인자로 shellcode 용도의 50bytes를 입력하였다. 그러면 위와 같이 0xbffffc3a 주소부터 두 번째 인자가 저장되는 것을 확인할 수 있다.

 

 

[사진 6]

따라서 페이로드는 위와 같이 임의의 값 "\x90" 44bytes를 입력하여 ebp까지 변조해주고 ret는 [사진 6]에서 확인한 두 번째 인자의 주소로 변조한다. 그리고 두 번째 인자로 shellcode를 입력해주는데 사용한 shellcode는 다음과 같고 setreuid 함수가 포함되었다.

\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\xcd\x80

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

이대로 실행하면 darkelf 계정의 password를 확인할 수 있다.

728x90
728x90

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

LOB orge Write-Up  (0) 2019.07.31
LOB darkelf Write-UP  (0) 2019.07.30
LOB orc Write-Up  (0) 2019.07.30
LOB goblin Write-Up  (0) 2019.07.30
LOB cobolt Write-Up  (0) 2019.07.30

+ Recent posts