1. 程式人生 > 實用技巧 >pwn之棧衝區溢位漏洞X64與X86

pwn之棧衝區溢位漏洞X64與X86

Java基礎語法

註釋

單行註釋 //後加註釋內容

多行註釋 /* 加註釋內容 */

文件註釋JavaDoc /** 加內容 */

識別符號

關鍵字

注意點

  • 識別符號都應該以字母(A-Z或a-z),美元符($),或下劃線(_)開始
  • 首字元後可以是字母(A-Z或a-z),美元符($),下劃線(_)或數字的任何組合
  • 不能使用關鍵字作為變數名或方法名
  • 識別符號是大小寫敏感的

資料型別

  • 強型別語言:要求變數的使用要嚴格符合規定,所有變數都必須先定義再使用 -java,c++
  • java的資料型別分為兩大類
  1. 基本型別:

    a.數值型別

    ​ 整數型別:byte佔1個位元組範圍

    short佔2個位元組範圍

    int佔4各位元組範圍,最常用

    long佔8個位元組範圍,常在數字後加L

    ​ 浮點型別:float佔4個位元組,常在數字後加F

    double佔8個位元組

    ​ 字元型別:char佔2個位元組,只能用單引號;string不是關鍵詞,它是一個引用型別,只能跟雙引號

    b. boolean型別:佔1位,只含true或false

  2. 引用型別:

    a.類

    b.介面

    c.陣列

位元組與位

  1. 位(bit):計算機內部最小儲存單位,11001100是一個八位二進位制數
  2. 位元組(byte):計算機中資料處理的基本單位,常用B表示
  3. 1B=8bit
  4. 字元:計算機中使用的字母,數字,字和符號

整數拓展

//二進位制:0b開頭
//十進位制:生活中的數
//八進位制:0開頭
//十六進位制:0x開頭
int i=10;	//輸出10
int i=010;	//輸出8
int i=0x10;	//輸出16
int i=0x11;	//輸出17

浮點數拓展

float,double型別是有限字長,資料是離散的,存在舍入誤差,只是大約資料,接近卻不等於

最好完全避免使用浮點數進行比較

資料比較一般使用BigDecimal類

字元拓展

char c1='a';
char c2='中';
System.out.println((int)c1);
//此時輸出97
System.out.println((int)c2);
//此時輸出20013

(int)c這一步驟是對字元進行強制轉換,操作方法為(型別)變數名

所有的字元本質還是數字

底層編碼:Unicode表(例;97=a,65=A),2個位元組,表示範圍0~65536

轉義字元:1.\t 製表符

​ 2.\n 換行 ........

布林值擴充套件

boolean flag=true;
if( flag=true);{}
if( flag);{}

這兩個if語句是完全等價的,預設進行判斷

型別轉換

  • java是強型別語言,在有些運算時需要型別轉換

不同型別的資料應該轉為同一型別,再進行運算

  • 低-------------------------------------------------------------------------高(容量)

byte,short,char------>int------>long------>float------>double

  • 強制轉換 (型別)變數名 高--->低

    自動轉換 低--->高

  • 注意點

    1.不能對布林值進行轉換

    2.不能把物件型別轉換為不相干型別

    3.在把大容量轉換為低容量時需要強制轉換,反之不用

    4.轉換的時候可能存在記憶體溢位,或者精度問題

    int i=128;
    byte b=(byte) i;
    System.out.println(i);			//此時i輸出128
    System.out.println(b);			//此時b輸出-128
    

    (byte) i;這一步發生記憶體溢位,因為byte型別最高到127,應避免出現記憶體溢位

    System.out.println(23.4);			//此時輸出23.4
    System.out.println((int)23.4);		//此時輸出23
    System.out.println(-45.86f);		//此時輸出-45.86
    System.out.println((int)-45.86f);	//此時輸出-45
    

    在進行浮點數轉換時出現精度問題*

    5.操作比較大的數的時候,注意溢位問題

    int a=20_0000_0000;                 //JDK7新特性,數字之間可以用下劃線分隔
    int b=30;
    int c=a*b;
    		System.out.println(c);				//此時輸出-129542144,出現溢位問題
    long d=a*b;
            System.out.println(d);				//輸出-129542144,因為定義a,b時為int型別,所以											在轉換之前已經溢位
    long e=a*(long)b;
            System.out.println(e);				//輸出60000000000,在計算前先將int型別強制轉化												為long型別,強制轉換對a或b或全部都可
    

變數

  • 理解:變數類比於一片空間或位置,而值類比於空間中的東西

  • java是強型別語言,每個變數都必須宣告型別,型別可以是基本型別,也可以是引用型別

  • java變數是最基本的儲存單元,其要素包括變數名,變數型別和作用域

    變數作用域包括類變數例項變數區域性變數

    public class Demo1 {            //這是一個類----Demo1
    
       static double salary=2500;      // 類變數,資料型別前加static,從屬於類,和類一起存在消失
    
        String name;
        int age;                     //例項變數,作用於具體類中,具體方法外,從屬於物件
        boolean question;
    
        public static void main(String[] args) {        //這是一個main方法
            int a=10;                   //區域性變數,作用於具體方法中,離開此方法則失效
            //變數型別  變數名字   具體值
            Demo1       demo1   = new Demo1();                 //要在方法中用例項變數必須如此
                                                                // 快捷鍵alt+回車
            System.out.println(demo1.age);              //輸出0,因為沒給賦初始值,會變為預設值
            System.out.println(demo1.name);             //輸出null,同樣原因
            System.out.println(demo1.question);         //輸出false,
        }
        
        public void add() {                          //其他方法,add方法
            System.out.println(salary);               //不用採取例項變數那種操作,直接可以輸出
        }
        
    }
    

常量

  • 初始化後不能再改變值!
  • 常量可以理解為一種特殊變數,其值被設定後,在程式執行過程中不允許被改變
final 常量名=值;
例    final int A=3;
  • 常量名一般使用大寫字元

命名規範

  • 所有的變數,方法,類名:見名知意
  • 類成員變數:首字母小寫和駝峰原則:monthSalary
  • 區域性變數:首字母小寫和駝峰原則:monthSalary
  • 常量:大寫字母和下劃線:MAX_VALUE
  • 類名:首字母大寫和駝峰原則:MonthSalary
  • 方法名:首字母小寫和駝峰原則:add(),addMoney()

運算子

  • 算術運算子:+, -, *, /, %(取餘,叫做模運算), ++, --

    • 除法運算時可能會產生小數,故需要強制轉換
  • 在加法運算中,不同型別的資料相加,在含有long型別時,輸出預設為long型別;反之都為int型別

    • b=a++:先把a賦值給b,a再自增
  • b=++a:a先自增,再賦值給b

  • 很多運算,我們會使用一些工具類來操作,例如Math類

  • 輔助運算子:=

  • 關係運算符:>, <, >=, <=, ==(等於), !=instanceof 返回值為boolean值,即true,fse

  • 邏輯運算子:&&, ||, !

    boolean a=true;
    boolean b=false;
            System.out.println(a && b); 	//輸出false
    										//與運算:同真得真
            System.out.println(a || b);     //輸出true
    										//或運算:有真得真
            System.out.println(a && b);     //輸出true
    										//非運算:真假假真
    

    與運算中的短路運算

    int c=5;
    boolean d=(c<4) && (c++<4);
            System.out.println(d);
            System.out.println(c);
    輸出
    false    //第一步中c=5已經小於4,直接省去第二步,輸出false
    5		 //如果沒有省,則c++後為6,但輸出為5,故省去
    

    在與運算中,如果第一項為false,則會略去第二步,直接判定為false

  • 位運算子:&, |, ^, ~, >>, <<, >>>(瞭解)

    A=0011 1100
    B=0000 1101
    -----------------
     A & B=0000 1100     //與運算:同1得1
     A | B=0011 1101     //或運算:有1得1
     A ^ B=0011 0001     //異或運算:同0異1
     ~ B=  1111 0010     //非運算:0110
    

    關於左移右移得面試題

     /*
            計算機中怎樣計算2*8=16最快?   2*2*2*2=16
    
          分 析: 0000 0000   0
                 0000 0001   1
                 0000 0010   2
                 0000 0100   4
                 0000 1000   8          
                 0001 0000   16          在二進位制中1這一位左移一位,對應於十進制中乘以2
          結 果: 利用左移運算<<,給2左移三位,即給2乘以三個2
    */
            System.out.println(2<<3);  //輸出16
    /*
          結 論:<<一次對應於乘以2
                >>一次對應於除以2
    */
    
  • 條件運算子:?:

 /*
        x?y:z
        如果x=true,則輸出y,否則輸出z
 */
        int score1=50;
        String type1=score1<60?"不及格":"及格";
        System.out.println(type1);
//輸出
不及格
        int score2=70;
        String type2=score2<60?"不及格":"及格";
        System.out.println(type2);
//輸出
及格
  • 擴充套件賦值運算子:+=, -=, *=, /=

    a+=b;			//a=a+b
    a-=b;			//a=a-b
    

    補充 字串連線符

int a=10;
int b=20;
System.out.println("abc"+a+b);		//當+左端出現string型別,則會把右端的數轉為													string型別,並且進行連線
//輸出
abc1020
int a=10;
int b=20;						//反之,當+右端出現string型別時,左邊運算則不受影響,並且進行連線
System.out.println(a+b+"abc");
//輸出
30abc

可以想象成從左到右進行作用

包機制

包的本質就是資料夾

  • 為了更好地組織類,java提供了包機制,用於區別類名的名稱空間
  • 包語句的語法格式為:
Package pkg1[.pkg2[.pkg3...]];
  • 一般利用公司域名倒置作為包名 例如:com.baidu.www com.li.base com.li.exercise

  • 為了能夠使用某一個包的成員,我們需要在java程式中明確匯入該包,使用"import"語句可完成

import com.lizhao.base.Demo02;			//在base下的Demo02中匯入exercise下的Demo01
import com.lizhao.base.*;     			  //*為萬用字元,匯入這個包下所有的類

JavaDoc----一種註釋

  • javadoc命令是用來生成自己API文件的
  • 引數資訊
    • @author 作者名
    • @version 版本號
    • @since 指明需要最早使用的JDK版本
    • @param引數名
    • @return返回值情況
    • @throws異常丟擲情況
/**
 * @author lizhao
 * @version 1.0         這段註釋是加在類上邊的
 * @since 1.8
 */
public class Demo01 {
    String name;

    /**
     *
     * @param name          這段註釋是加在方法上邊的,且是自動生成的
     * @return
     */
    public String test(String name){
        return name;

生成 javadoc文件

1.通過命令列:javadoc 引數 Java檔案

2.通過IDEA

​ a. 點選 Tools-> Generate JavaDoc

​ b.