Category Archives: 지식

OpenWRT DIR-825 Failsafe 모드

WRT 설치하고 몇일동안 신나게 세팅했다 -_-

근데 iptables 건들다가

으앜! accept 를 다날려먹고 그걸 적용시켜버렸어 ㅠㅠ

pc에서 더이상 이더넷을 통한 접속은 impossible

혹시나 리셋 누르면서 전원 넣으면 복구될지 …

해봣는데 반응없어 ㅠㅠ

웹 뒤지고 뒤지다가

http://wiki.openwrt.org/doc/howto/generic.failsafe

이걸 발견!

1. Set your computer’s IP to 192.168.1.2, subnet 255.255.255.0

2. Power cycle the router (turn off and turn on)

3.Immediately after the above step, rapidly click a button on the router for 60 seconds (it may be any button). Note: If your router has a ridiculously long boot time (such as DIR-300 A), then you may do this for a longer time.

전원 넣을때 빠르게 뭔가를 클릭하면 된다는데

뭔가가 WDS 버튼이었다 -_-

열심히 광클해주니까

전원램프가 빠르게 깜빡거리더니 나중에는 미친듯 깜빡거림

그와동시에 192.168.1.1 핑나가고 , 펌웨어 재설치 해주고 상황종료

여기다가 USB mod  해서 2개의 USB 포트를 만들생각이었는데

요즘 하는거마다 뻑나서 나중에 해야겠다 ㅠ

그나저나 내 세팅값 어디로 ㅠㅠ

esp와 ebp의 차이

32비트 레지스터 – 접두어로 Extended의 E를 따다 쓴다
EAX – Accumulator Register  누산기에 해당하며 대부분의 연산들이 수행된다.
EBX – Base Register  일반적인 데이터 레지스터로, 원래 16비트 모드에서는 포인터로 사용했다.
ECX – Counter Register  개수, 횟수 등을 저장하는 카운터로 주로 사용된다.
EDX – Data Register  누산기의 확장으로 누산기와 관련된 연산에서 사용된다. EDX와 EAX를 합쳐 64비트 연산을 하는 경우가 대표적이다.
ESI – Source Index  문자열 연산에서 사용되는 원본 주소를 담는다.
EDI – Destination Index   문자열 연산에서 사용되는 목적 주소를 담는다.
EBP – Base Pointer  현재 스택 프레임의 주소를 담으며, 일반적인 목적으로 쓰기도 한다.
ESP – Stack Pointer  스택의 꼭대기 주소를 담는다.
EIP – Instruction Pointer  현재 실행되는 명령의 주소를 담는다.
16비트 – 32비트 레지스터 에서 E만 빼면된다 ( ex > EAX – AX )  당연하겠지만 오버플로는 버려진다.
8비트 – AH,AL 같이 H와 L 이 접미사로 붙는다 H(high)는 상위 8비트 L(low)는 하위 8비트로 나타낸다
64비트 – E의 접두어 대신에 R을 쓴다 (ex > EAX – RAX )
세그멘테이션 (Segmentation:분할,구분)
CS (Code Segment) – 프로그램의 실행명령어(Instruction) 들이 저장되어있는 공간 (함수)
DS (Data Segment) – 데이터들이 저장되어있는공간 (전역변수,상수)
SS (Stack Segment) – 스택 메모리의 공간 (지역변수)
ES (Extra Segment) – 변수들을 위한 추가 메모리 영역
플래그(Flag:깃발,신호기)
    제어플래그 – 프로세서의 동작을 제어하는 플래그
    DF(Direction Flag:방향 플래그) – movs나 cmps 같은 블록데이터이동방향 결정 (1이면 감소)
    IF(Interrupt Flag:인터럽트 플래그) – 1이면 인터럽트 사용가능
    TF(Trap Flag:트랩 플래그) – 1이면 명령어 수행시마다 정지(Trap)
    상태플래그 – 특정 명령의 결과를 나타내는 플래그
    CF(Carry Flag:캐리 플래그) – MSB(최상위비트)에서 올림수 또는 내림수가 발생하면 SET
    OF(Overflow Flag:오버플로 플래그) – 결과가 2의보수로 표현할수있는범위가 아니면 SET
    SF(Sign Flag:부호 플래그) – 결과가 음수이면 SET
    ZF(Zero Flag:제로 플래그) – 결과가 0 이면 SET
    AF(Auxiliary Carry Flag:보조캐리 플래그) – 3번째와 4번째비트간에 캐리가 발생하면 SET
    PF(Parity Plag:패리티 플래그) – 짝수 패리티일경우 SET
사용자 삽입 이미지
참고문서 :

메모리 구조

메모리 구조에대해서 정리를 해보려고 한다 (메모리 구조가 맞나?)
아래는 간단한 함수, 전역변수, 지역변수, 동적할당, static(?) 의 주소값을 뿌려준다.
#include <stdio.h>
#include <stdlib.h>

void func1(){ return ; }
void func2(){ return ; }
void func3();  // 3번은 뒤에다가 선언
int g1=0;
int g2=0;

int main()
{
int l1=0;
int l2=0;

void * h1 = malloc(10);
void * h2 = malloc(10);

printf(“global 1 : 0x%008X\n”,&g1);
printf(“global 2 : 0x%008X\n”,&g2);
printf(“local  1 : 0x%008X\n”,&l1);
printf(“local  2 : 0x%008X\n”,&l2);
printf(“heap   1 : 0x%008X\n”,h1);
printf(“heap   2 : 0x%008X\n”,h2);
printf(“\n”);
printf(“static 1 : 0x%08X\n”,”Alpha”);
printf(“static 2 : 0x%08X\n”,”Beta”);
printf(“\n”);
printf(“function1: 0x%08X\n”,func1);
printf(“function2: 0x%08X\n”,func2);
printf(“function3: 0x%08X\n”,func3);
printf(“mainfunc : 0x%08X\n”,main);
free(h1);
free(h2);
return 0;
}
void func3(){ return ; }

이걸 실행시켰을때


global 1 : 0x0804A02C
global 2 : 0x0804A030
local  1 : 0xBFA3693C
local  2 : 0xBFA36938
heap   1 : 0x091C4008
heap   2 : 0x091C4018

static 1 : 0x08048818
static 2 : 0x08048831

function1: 0x08048564
function2: 0x08048569
function3: 0x080486CE
mainfunc ; 0x0804856E

이런 결과가 나온다

주소를 가지고 정렬해보면

// 코드 세그멘테이션(Code Segmentation)

함수들
function1: 0x08048564    // void func1(){ return ; }
function2: 0x08048569    // void func2(){ return ; }
mainfunc : 0x0804856E   // int main()
function3: 0x080486CE    // void func3(){ return ; } 메인뒤에 있다!
//데이터 세그멘테이션(Data Segmentation)
정적배열    
static 1 : 0x08048818    // printf(“static 1 : 0x%08X\n”,”Alpha”);
static 2 : 0x08048831    // printf(“static 2 : 0x%08X\n”,”Beta”);
전역변수
global 1 : 0x0804A02C    // int g1=0;
global 2 : 0x0804A030    // int g2=0;
동적할당 // 순서대로 늘어난다
heap   1 : 0x091C4008     // void * h1 = malloc(10);
heap   2 : 0x091C4018       // void * h2 = malloc(10);
// 주소가 확 늘어난다 !!  (단위가 틀려짐 !!)
//스택 세그멘테이션(Stack Segmentation)
지역변수 // 거꾸로 자람으로 스택방식인것을 확인할수있다.
local  2 : 0xBFA36938    // int l2=0;
local  1 : 0xBFA3693C    // int l1=0;
결론 : 지역변수만 거꾸로 늘어난다(스택)
간단하게 사용자 삽입 이미지 이걸 알아보는 실험? 이었다.

컴퓨터가 음수를 나타내는 방법

왜 char형, 1바이트 그러니까 8비트로는 -128~ 127까지 표현할수 있을까?
-127~127 까지도 아니고 -128~128 까지도 아니고…
먼저법 컴퓨터가 음수를 처리하는 방법을 알아볼 필요가있다.
워드프로세서 자격증공부할때도 배우다시피(왜배우는지는 지금도 이해가안간다만)
컴퓨터가 음수를 처리하는데는
부호와 절대값
1의 보수
2의 보수
세가지 방법이 있다
부호와 절대값은 최상위 비트(MSB)를 부호비트로 사용한다
가령 -25는
1001 1001  이런식으로 최상위 비트만 가지고 1이면 음수 0이면 양수처리를 하였다.
위 방법으로는
0001 1001 (25)
1001 1001 (-25)
이렇게 표현할수있다
표현범위는
0000 0000 ~ 0111 1111 ( +0 ~ +127 )
1000 0000 ~ 1111 1111 ( -0 ~ -127 )
이 방법의 문제점으로 계산이 복잡해진다(덧셈만으로 해결이안됨), 최종표현할수있는값은 7비트로 한비트가 줄어든다.
다음으로 1의 보수는 그냥 2진수에다가 NOT 연산을 해준결과이다
0001 1001 (25)
1110 0110 (-25)
이렇게 표현할수있다
1의 보수로는 덧셈만 가지고 연산이 가능해진다.
_0001 1001 (25)
+1110 0110 (-25)
=1111 1111 (-127) = (-0)
_0001 1001 (25)
+1111 0101 (-10)
=0000 1110 (+14)
두번째 계산에서 뭔가 좀 이상하지만 최상위비트의 자리넘침(carry)이 발생하면 최하위비트에 다시 더해주면 해결가능하다.
즉 0000 1111 (+15) 로 정상적인 값이 나온다
1의 보수의 문제점으로는 귀찮게 자리넘침신경써야되고 넘치면 더해줘야되고, 0의 표현방법이 두가지 존재하게된다
표현범위는
0000 0000 ~ 0111 1111 ( +0~+127)
1000 0000 ~ 1111 1111 ( -127~-0)
0000 0000 과 1111 1111 이 모두 0으로 공간이 낭비됨을 알수있다
마지막으로 2의 보수 방법으로 1의 보수에다가 1만 더해주면된다.
0001 1001 (25)
1110 0110 <- 1의보수 에다가 1을 더해준다
1110 0111 (-25) <- 2의보수로 -25를 표현한것
이방법은 계산도 용이하고 알려진 단점도 없어 현재 가장 많이 사용하는 방법이다.
_0001 1001 (25)
+1110 0111 (-25)
=0000 0000 (0)  별다른 방법없이도 깔끔하게 떨어진다
_0001 1001 (25)
+1111 0110 (-10)
=0000 1111 (15) 역시 깔끔하게 떨어진다
표현범위역시 우수하다
0000 0000 ~ 0111 1111 ( 0 ~ +127)
1000 0000 ~ 1111 1111 ( -128 ~ -1) 로써 겹치는 범위 없이 표현이 가능하다
현재 2의보수가 가장 널리 이용되며
그의 영향으로 부호있는경우는 -(2^n)/2 ~ +(2^n – 1)/2 만큼 표현이 가능하다 (n 은 비트수)