처음으로 Dreamhack을 통해 wargame을 접하게 되었는데 몇일동안 삽질을 한지 모르겠네요. 생각날때마다 코드 찾고 하느라 시간을 거의 보냈습니다.
이 글을 보는 분께 최대한 많은 정보를 주기 위해 작성하겠습니다.
처음 basic_exploitation_000 은 기초로 첫번째 문제 인데
이 문제의 요점을 알기 위해서는 파일을 다운받은 후 code를 분석을 먼저 해야합니다. (알집형태이니 zip 명령어로 풀어주세요)

vi basic_exploitation_000.c 명령어로 파일을 열면 아래와 같은 코드가 나오게 되는데

코드를 간단히 해석하게 되면 초기 버퍼가 시작하는 주소를 print 하고 scanf를 통해 사용자가 쓰는 문자를 최대 14byte를 받아드려 buffer에 저장 한다.
프로그램은 시작 된 30초 후 'Time out'이라는 문구를 남기고 exit(-1)로 프로그램을 종료한다는 의미 인데 여기서 주목해야할 점은 buffer의 크기이다.
buf(0x80)은 버퍼의 크기가 0x80이라는 의미 인데 0x80 16진수 즉 ascii 코드(https://huskdoll.tistory.com/988)로 10진수로 나타낼시 128byte를 나타낸다. 그런데 scanf가 141byte 까지 입력 받을 수 있다.
그러면 buffer의 크기 보다 많은 값을 입력시 buffer를 초과해버린다는 것인데 buffer를 넘어가면 sfp(saved frame point)와 ret(return) 의 범위까지 침범하게 되는데 ret라는 부분은 다음 명령어가 실행될 부분을 나타내게 된다.만약 buffer overflow를 통해 ret라는 영역까지 덮어쓰기를 하고 그 다음 명령어의 시작점을 buffer의 시작점으로 한 후 buffer 안에 shellcode를 를 넣어둔다면 자동적으로 shell code를 실행하여 쉘을 획득 할 수 있을 것이다.

이제 프로그램 실행시 매번 변화하는 buffer의 시작점을 따오고, 버퍼에 shell code를 넣은후 버퍼의 크기를 고려하여버퍼의 시작점을 가르키도록 ret(return)에 buffer 주소값을 입력하면 되는 것이다. 원래라면 다른 명령어가 실행할 부분으로 이동하는 주소 값이 ret에 저장되어 있다.
아래 코드는 위 내용을 바탕으로 작성하였다.

shell code는 26바이트를 가져왔고 buffer+sfp 크기인 128+4 = 132byte 에서 26바이트를 뺀 106 byte를 특정 값으로 채워야한다. 물론 특정 값은 의미 없는 값으로 채운다.
중간중간 print 문을 넣은 것은 내가 정확하게 값을 추출했는지 확인하기 위해 중간중간 값을 print하도록 하였다.

buffer 형식은 초기 'buf = (' + 10자리 buffer 주소값 + ')' 로 구성되어 있기 때문에 recvuntil를 사용해 가운데 buffer 주소값만 가져와 buf_add에 저장후
payload에 대입할 값은 shellcode(26byte) + 의미없는 값[\x90(A)x106](106byte) + buffer 시작점(4byte) = 136byte를 이용해 buffer, sfp, ret 값을 채웠다. 이를 프로그램에 보내게 되면 쉘이 시작되 권환을 획득하게 된다.
int형으로 변환한 이유가 출력된 buffer 주소가 char type이기 때문에 int형으로 변환하여 코드를 붙여줬다.
process 명령어는 서버와 동일하게 작동하는 파일을 대상으로 하기 위해 사용하였다. 성공시 서버에 적용해 보기 위해서는 process 명령어 대신 remote에 아래 host와 port를 넣어 사용하면 된다.


작동시 권한 획득 및 파일을 열어 볼 수 있다.
'Coding > Wargame' 카테고리의 다른 글
| [ Burp suit] File upload 문제3 풀이 (0) | 2022.05.31 |
|---|---|
| [ Burp suit] File upload 문제2 풀이 (0) | 2022.05.30 |
| [ Burp suit] File upload 문제 풀이 (0) | 2022.05.29 |
| [SQL Injection]Error base SQL Injection을 이용한 Database table, column name (0) | 2022.05.25 |
| [SQL Injection] burp suit 문제 풀이 (0) | 2022.05.24 |
