zj3t

email: euntaejang@gmail.com

Latest Posts
rootshell.kr (104.199.254.30) 으로 이전했습니다.

이곳블로그 보다 더 심도있는 게시글을 위주로 올리고있습니다.

감사합니다.
저번의 마지막 글 이후로 꽤 시간이 흘렀습니다.

새로운 블로그 관리하느랴 기존의 이 블로그에는 소흘했었는데요!

104.199.254.30

아직 도메인을 구매하지 않아 깔끔하지 않지만 꽤 좋은 글들을 쓸려고 노력하는 블로그 입니다.

앞으로 이 곳 또한 많이 찾아서 정보 공유해주시면 감사하겠습니다!!!

이 블로그는 제가 보안공부를 처음하면서 남긴 글들이 보안공부 입문자들에게 조금은 도움이 되고있다는 것을 아직도 메일을 받으면서 깨닫고있습니다!!

이 블로그 게시글에 대한 의견과 문의, 질문, 피드백 모두 확인하겠습니다!!

새로운 블로그 주소는 104.199.254.30 입니다.(한번 더 강조....)

안녕하세요 오랫만에 글을 씁니다.

지금 latifundium.blogspot.kr 블로그는 제가 아주 초기때, C언어를 공부할 때 부터 공부한 것을 하나씩 차곡차곡 올렸던 블로그입니다.

벌써 2년정도 된거같은데......

현재 블로그의 글이 너무 오합지졸하고, 지식을 주지못하는 내용도 있고, 제가 마음에 들지 않는 글도 있어서

google cloud platform에 wordpress 를 적용시켜 새로운 블로그를 만들었지만 아직 게시글이 부족하여 공개는 안하고 있습니다. 앞으로 이곳에도 글을 올리겠지만 대부분의 글은 새로운 블로그에 작성하고 좀 더 시간이 흐른 후에 url을 공개하겠습니다!!

SQL injection 문제는 재미있어서 계속 포스팅을 해보도록 하겠습니다.


로그인을 하면 GET 요청으로 서버측에 전송이 되는 것을 확인 할 수가 있었습니다.
그리고 정답이면 OK가 출력되는 것을 보니...블라인드 SQL 인젝션 문제라는 것을 확인할 수가 있었습니다.




id=guest' and 1=1-- &pw=guest를 입력했을 때의 반응입니다.
사실 여기서는 보이지 않았지만 

id=guest'-- &pw=1
을 입력했을 때에도 guest로 로그인이 되며 
id=admin'-- &pw=1일 때도 admin으로 로그인이 됩니다.

그렇다면 블라인드 sql 인젝션 공격을 시도해 볼 수 있게 되었습니다.

여러가지를 필터링하고 있어서 공격이 쉬울 것같다는 생각은 들지 않았습니다.
근데 저 white space 필터링이 공백 필터링인거 같은데, 공백 필터링을 하지 않더라구요 

만약 space bar 즉, %20을 필터링한다면,

%0A(줄바꿈), %09(Tab), (), 로 우회할 수가 있습니다.

id=admin'and(1=1)-- 을 했을 경우에도 정상적으로 admin 로그인이 되었습니다.


방금까지 OK guest 또는 OK admin 이런 메시지를 확인할 수 있었는데 만약 거짓 조건을 줘버리면 False가 뜹니다.

필터링에 걸리게 되면 No hack 메시지가 뜨게 됩니다.





위 세개의 사진으로 admin의 password길이를 알 수가 있었습니다. 참과 거짓의 반응으로 원하는 답을 찾아가는 블라인드 sql 인젝션 공격임을 다시한번 확인할 수 있습니다.


이는 공격을 하기위한 python 스크립트 입니다.


문자열을 자르기 위해서
Oracle 서버에서는 substr 함수를 사용하고
Ms-SQL 서버에서는 substring 함수를 사용한다고 합니다.
계속 하던데로 substr을 했는데 계속 실패해서 많은시간을 소비했는데 substring으로 했을 때 된걸보니 Ms-sql 서버인가봅니다.

확실하진 않지만 서버차이인건 분명한거라 생각합니다.
새로운 워게임 사이트를 알아내서 시간날 때 마다 풀고 있습니다.

문제는 쉬운데 webhacking.kr 이후로 오랫만에 urllib를 이용한 코딩문제가 나와서 포스팅을 하게 되었습니다.



<초기 화면>




POST Request할 id pw의 name확인


실질적으로 동작하는 웹 페이지


주석참조!!!!



예전에 ROP 기법을 공부할 때 풀어봤던 문제였는데 폴더를 정리하던 중 그 때 공부하면서 작성한 POC가 있어서 공유해보겠습니다.

저는 이 문제는 ROP 기법의 정석적인 문제였습니다. 또한 ASLR 까지도 적용되어있어서 공부가 많이 되는 문제였습니다.

정리는 제가 주관적으로 생각했을 때 밑에 블로그가 설명을 가장 잘 적어논 것 같아서 링크 첨부하겠습니다.
https://yous.be/2014/03/19/ropasaurusrex-a-primer-on-return-oriented-programming/



파일 첨부(google drive)
ropasaurusrex.py


오랫만의 리버싱 포스팅입니다.
요새 비오비 플젝때매 바빳는데 잠깐 짬내서 reversing.kr의 PEpassword문제와 AutoHotkey문제를 풀었습니다.

모든 풀이는 제외하고 간단히 방법만 포스팅하겠습니다.

먼저 두개의 바이너리가 제공됩니다.
original.exe와 packed.exe파일입니다.


<original.exe>
<packed.exe>

흠...original.exe 파일은 원본파일이고, packed파일은 패킹이 되있어서 password가 맞으면 언패킹이 되는 문제인거 같습니다.

그럼 일단 packed.exe파일을 리버싱을 해서 password를 알아내야할 것 같습니다. original.exe파일을 왜 줬을지도 생각해 봐야하겠구요!!!

혹시나....아이다의 헥스레이가 빛을 바랠 수 있을지 시도해봤습니다.

....??? fail 이라네요.
sp 값에 문제가 있어서 디컴파일이 안된다는데, 그럼 수정을 해봐야겠습니다.


오류가 생긴 부분에 가서 alt+k를 누르면 저런 창이떠서 sp값을 바꿔줄 수가 있습니다. 이 값을 current sp 값과 동일하게 바꾸면 왠만하면 해결 됩니다.



또이러네....ida의 헥스레이 기능은 포기하겠습니다.

근데 일단 저 부분이 뭔가 있을 것 같은 예감이 들었습니다. 왜 저 부분이 문제가 있을까??? 생각해보고 넘어 가도록 하겠습니다.

저 부분(CMP 부분)이 값을 입력하면 멈춰서 CALL 004091D8 부분에서 연산 후 리턴값을 비교하는 부분입니다.

함수안은 요런데....흠....이건 도저히 연산을 코드로 못짤꺼 같아서 일단 CMP 부분후의 ZF를 CMP 부분이 참일 떄로 맞추었습니다.


비교부분!!


첨부터 의심스러웠는데.. 여기서 UPX 언패킹을 upx -d 옵션을 쓰지 않고 한번쯤 디버거로 언패킹을 해보신 경험이 있으신 분은 PUSHAD - POPAD 이어지는 언패킹과정 아실꺼에요!!

하지만 여기서도 PUSHAD - POPAD로 이어지는 구문을 봤었는데 혹시나해서 BP를 걸어보니 CMP 부분을 맞춰주고 난후에 여기서 걸리는 것을 확인했습니다ㅎㅎ



여기서 주석을 참고하시고 코딩을 하시면 됩니다!!!!


exploit을 적용해야하는 프로젝트를 진행하고 있는데, 그 공부를 하던 중 익스 공부를 너무 쉰거같다는 느낌을 받아서 pwnable.kr 의 echo1 문제를 풀게 되었습니다.






소스 코드는 요즘 ida에서 왠만한 거는 다 번역해주니 필요한 부분만 올리겠습니다.

우선 취약점이 터지는 부분은 echo1() 함수 안에서 였습니다.

__int64 echo1()
{
  char s; // [bp-20]

  (*((void (_QWORD))o + 3))(o); //greetings
  get_input(&s, 128LL);  //get_input
  puts(&s);
  (*((void (_QWORD))o + 4))(o); //byebye()
  return 0LL;
}

이 부분인데 

main 함수 안에서

id = user_name[0]; //input value(8byte)

getchar();

func[0] = (__int64)echo1;
...
...
...
        puts("\n- select echo type -");
        puts("- 1. : BOF echo");
        puts("- 2. : FSB echo");
        puts("- 3. : UAF echo");
        puts("- 4. : exit");
        printf("> ", v3);
        v3 = &selection;
        __isoc99_scanf("%d", &selection);
        getchar();
        if ( (unsigned int)selection > 3 )
          break;

        ((void (const char *, int *))func[(unsigned __int64)(unsigned int)(selection - 1)])("%d", &selection);


1번을 선택하면 echo1 함수를 호출 할 수가 있습니다.
나머지 echo2나 echo3은 함수는 이 문제에서는 신경 쓸 필요가 없었습니다.

echo1 함수 안을 보면

32크기의 s 변수에 128 만큼의 값을 쓸 수 있도록 만들어 놓았습니다.

그렇다면 ret 까지 덮어서 원하는 공격을 수행할 수 있습니다.

일단 취약점이 터지는 부분은 알았는데 어떻게 공격을 수행해야 할까요??

저기 빨간색글씨들이 공격에 필요한 요소들입니다.
-----------------------------------------------------------------------------------------
프로그램을 보면,

1. name을 입력받는다.
2. id에 입력한 name을 저장한다.
3. 메뉴를 선택한다.
4. 1번 선택시 echo1() 함수로 들어간다.
5. echo1()에서 변수 s 를 덮어 씌울 수 있는 입력을 수행할 수 있다.
----------------------------------------------------------------------------------------

페이로드는 아마도...이런식?? 이 될 꺼같아요..(64bit임을 주의)
payload = |   nop slop(32) |  rbp (8) | ret | ......|

우선 id 가 중요하게 작용합니다. 저두 이걸 몰라서 해맸었습니다.
왜냐면 id 변수는....


bss영역에 있었습니다. 이 영역은 해커들의 영역이라고도 불리며 aslr의 영향을 받지 않는 곳으로 알려져 있습니다.

id 변수에서 내가 입력한 name을 저장하고, 그 name은 8 byte이므로 확실히 이 곳에 필요한 주소를 넣어 줄 수가 있습니다.

그럼 이 곳에 어떤 주소를 넣어 주어야 할까요?? 아마 jmp rsp 아닐까요??

왜냐하면 저는 사용할 페이로드가 

'A'*32+'b'*8+'id_addr(ret)'+'shellcode(64 bit)'

이기 때문입니다. 처음 32bit 쉘코드를 넣다가 계속 안되서 64bit임을 알고 찾아서 넣어줬더니 성공했습니다.

여기서 ret 을 하게 되면 id주소로 뛰게 되고(.bss 영역) id에는 jmp rsp 의 주소가 들어있기 때문에 jmp rsp 명령이 수행되게 됩니다.

ret이 수행되고 난후 스택은 rsp+8(64bit)가 되고 넣어준 shellcode를 가리키게 됩니다. 

그럼 파이썬으로 익스코드를 짜서 공격을 할 수가 있습니다.

풀이는 여기 까지 하겠습니다!!!