LOB troll Write-Up

2019. 7. 31. 01:12
728x90
728x90
728x90

LOB troll 풀어보자.

 

[사진 1]

주어진 코드를 보면 이전 문제보다는 제약 조건이 줄어들었다. 달라진 점은 첫 번째 인자의 47번째 값이 "\xff"이면 프로그램을 종료시킨다. 이전 문제까지 argv 인자들의 주소는 0xbfff로 시작했는데 주소가 0xbffe 이하로 되게끔 해야한다. 방법으로는 dummy 값을 많이 주면 된다. 두 번째 인자에 shellcode를 입력하고 많은 dummy를 입력하자.

 

 

[사진 2]

위와 같이 첫 번재 인자의 46번째 값이 "\xff"이면 프로그램은 종료된다.

 

 

[사진 3]

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

 

 

[사진 4]

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

 

 

[사진 5]

vampire 파일을 다른 이름(kampire)으로 복사해주고 gdb로 함수 프롤로그가 끝난 지점에 브레이크 포인트를 설정하자. 그리고 두 번째 인자에 shellcode 용도의 50bytes와 dummy 100,000bytes를 입력하자. 그러면 위와 같이 두 번째 인자의 주소가 0xbffe75dc인 것을 확인할 수 있다.

 

 

[사진 6]

[사진 5]에서 확인한 두 번째 인자의 주소로 ret를 변조하고 두 번째 인자로 shellcode를 입력하면 세그멘테이션 오류가 발생하고 종료된다. 생성된 core 파일을 확인하면 실제로 두 번재 인자가 저장된 주소는 0xbffe75ad임을 확인할 수 있다. 실제 주소가 차이나는 이유는 gdb를 통해 실행시키면 gdb 환경변수 등과 같은 이유로 실제 주소와 차이나기 때문이다.

 

 

[사진 7]

따라서 실제 주소로 변경하면 vampire 계정의 password를 확인할 수 있다. 사용한 shellcode는 다음과 같다.

\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

728x90
728x90

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

LOB skeleton Write-Up  (0) 2019.08.01
LOB vampire Write-Up  (0) 2019.07.31
LOB orge Write-Up  (0) 2019.07.31
LOB darkelf Write-UP  (0) 2019.07.30
LOB wolfman Write-Up  (0) 2019.07.30

+ Recent posts